引数の型に合わせてそれぞれ適切な振る舞いをする関数

[戻る]
季節はずれのゴムボート 2009/10/15(木) 07:12:52
template <class T, size_t N>
size_t GetArraySize(T (&)[N])
{
    return N;
}
T[] 形式で表せる、配列の要素数を取得する関数です。この関数を
std::vectorやstd::list の形式の要素数も取得できるようにしたいのですが
どのように書いたらいいのでしょうか?

επιστημη [E-Mail] [HomePage] 2009/10/15(木) 09:03:37
↓こんだけのことですかいのぅ...

#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <set>

template <class T, size_t N> inline
size_t GetArraySize(T (&)[N])
  { return N; }

template <class Container> inline
size_t GetArraySize(const Container& c)
  { return c.size(); }

int main() {
  int a[] = { 1, 2, 3, 4, 5, 6, 7 };
  std::vector<int> v(a,a+6);
  std::list<int>   l(a,a+5);
  std::deque<int>  d(a,a+4);
  std::set<int>    s(a,a+3);
  std::cout << GetArraySize(a) << std::endl;
  std::cout << GetArraySize(v) << std::endl;
  std::cout << GetArraySize(l) << std::endl;
  std::cout << GetArraySize(d) << std::endl;
  std::cout << GetArraySize(s) << std::endl;
}

tetrapod 2009/10/15(木) 09:03:47
多重定義すればいいと思うぞ (特殊化では不可能なので)

vector ならまだしも list の size を取ることに実用的意味があるか?と問うてみる。
俺ならやらない。

επιστημη [E-Mail] [HomePage] 2009/10/15(木) 10:08:14
もうひとつの解法: T[] なんか捨てちまえ。
代わりに array<T,N> 使う。
そうすればどんなコンテナでも size() でおっけぃ。

// VC++ 2008 (VC9)

#include <iostream>
#include <array>
#include <vector>
#include <list>
#include <deque>
#include <set>

namespace std { using namespace std::tr1; }

int main() {
  std::array<int,7> a = {{ 1, 2, 3, 4, 5, 6, 7 }};
  std::vector<int>  v(a.begin(),a.begin()+6);
  std::list<int>    l(a.begin(),a.begin()+5);
  std::deque<int>   d(a.begin(),a.begin()+4);
  std::set<int>     s(a.begin(),a.begin()+3);
  std::cout << a.size() << std::endl;
  std::cout << v.size() << std::endl;
  std::cout << l.size() << std::endl;
  std::cout << d.size() << std::endl;
  std::cout << s.size() << std::endl;
}

季節はずれのゴムボート 2009/10/17(土) 05:16:37
tetrapod さん、επιστημη さん、ありがとうございました。
もう一点質問させてください。
επιστημη さんの書かれた、「C++ テンプレートテクニック」の見よう見まねで勉強して
いるのですが、思い通りにならなくて困っています。

template<class Iterator_First, class Iterator_Second, int N>
void Deviation<Iterator_First, Iterator_Second, N>::
Diff(std::pair<Iterator_First, Iterator_First> iter_pair_first,
std::pair<Iterator_Second, Iterator_Second> iter_pair_second, int N )
この関数を
T[]型に対応させるため、iterator_traits を使って書く方法を教えたいただけないで
しょうか。

#include <iostream>
#include <vector>
#include <iterator>
#include <utility>

template<class Iterator_First, class Iterator_Second, int N>
class Deviation {
private:
    int deviation_;
public:
    Deviation() : deviation_(0){}
    void Diff(std::pair<Iterator_First, Iterator_First> iter_pair_first,
std::pair<Iterator_Second, Iterator_Second> iter_pair_second, int N = 10);
};

template<class Iterator_First, class Iterator_Second, int N>
void Deviation<Iterator_First, Iterator_Second, N>::
Diff(std::pair<Iterator_First, Iterator_First> iter_pair_first,
std::pair<Iterator_Second, Iterator_Second> iter_pair_second, int N )
{

    while(iter_pair_first.first != iter_pair_first.second)
    {
        deviation_ = *iter_pair_first.first - *iter_pair_second.first;
        std::cout << deviation_ << "\n";
        ++iter_pair_first.first;
        ++iter_pair_second.first;
    }
}
using namespace std;

int main()
{
    vector<int> v_first;    vector<int> v_second;

    v_first.push_back(1);    v_second.push_back(2);
    v_first.push_back(2);    v_second.push_back(4);
    v_first.push_back(3);    v_second.push_back(1);
    v_first.push_back(4);    v_second.push_back(3);
    v_first.push_back(5);    v_second.push_back(7);
    v_first.push_back(6);    v_second.push_back(6);
    v_first.push_back(7);    v_second.push_back(5);
    v_first.push_back(8);    v_second.push_back(10);
    v_first.push_back(9);    v_second.push_back(8);
    v_first.push_back(10);    v_second.push_back(9);

    int deviation = 0;
    int array_size_first;
    int array_size_second;
    
    Deviation<vector<int>::iterator, vector<int>::iterator, 10> dev;
    dev.Diff(make_pair(v_first.begin(), v_first.end()), make_pair(v_second.begin(),
v_second.end()), 10);

    int array_1st[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int array_2nd[] = {2, 4, 1, 3, 7, 6, 5, 10, 8, 9};
    // この型変換の方法がわかりません
    // dev.Diff(make_pair(array_1st, array_1st+10), make_pair(array_2nd,
array_2nd+10), 10);

    cout << deviation << "\n";
    
    return 0;
}

επιστημη [E-Mail] [HomePage] 2009/10/17(土) 06:37:59
↓よぉわからんが。

int array_1st[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int array_2nd[] = {2, 4, 1, 3, 7, 6, 5, 10, 8, 9};
Deviation<int*,int*,10> adev;
adev.Diff(make_pair(array_1st, array_1st+10), make_pair
(array_2nd,array_2nd+10), 10);

季節はずれのゴムボート 2009/10/17(土) 08:03:41
[[解決]]
επιστημη さん、お世話になります。
make_pair で型を指定すればできたんですね。
そっちでしたか・・・
勉強になりました、ありがとうございました。

επιστημη [E-Mail] [HomePage] 2009/10/17(土) 09:19:22
> make_pair で型を指定すればできたんですね。

ハァ?

古いスレッドには追加発言できません。