template <class T, size_t N>
size_t GetArraySize(T (&)[N])
{
	return N;
}
T[] 形式で表せる、配列の要素数を取得する関数です。この関数を
std::vectorやstd::list の形式の要素数も取得できるようにしたいのですが
どのように書いたらいいのでしょうか?
↓こんだけのことですかいのぅ...
#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;
}
多重定義すればいいと思うぞ (特殊化では不可能なので)
vector ならまだしも list の size を取ることに実用的意味があるか?と問うてみる。
俺ならやらない。
もうひとつの解法: 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;
}
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;
}
↓よぉわからんが。
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);
επιστημη さん、お世話になります。
make_pair で型を指定すればできたんですね。
そっちでしたか・・・
勉強になりました、ありがとうございました。
> make_pair で型を指定すればできたんですね。
ハァ?

 
  
  
  
  