std::iterator
というメンバーがいることを活かして、やりたいことができると思いますiterator_category
。これをSFINAEと組み合わせると、次のようなものが得られます。
#include <iostream>
#include <vector>
template <class X>
class my_class {
public:
my_class(X a, X b) {
std::cout << "in my_class(X,X)" << std::endl;
}
template <class Iter>
my_class(Iter a, Iter b, typename Iter::iterator_category *p=0) {
std::cout << "in my_class(Iter,Iter)" << std::endl;
}
};
int
main()
{
char buf[] = "foo";
std::vector<char> v;
my_class<int> one(1, 2);
my_class<char*> two(&buf[0], &buf[3]);
my_class<char> three(v.begin(), v.end());
return 0;
}
これは以下を出力します:
in my_class(X,X)
in my_class(X,X)
in my_class(Iter,Iter)