我正在创建一个类,它是一种容器,我想创建一个构造函数,可以采用像std :: vector和其他标准容器这样的“第一个”和“最后一个”迭代器。什么是正确的语法? (我想要一个模板,一个可以使用任何第一个/最后一个迭代器类型的函数(比如我认为的标准库)。非常感谢!
作为一个例子,我想要这样的东西:
template<class ...> MyClass(... first, ... last)
但是......是什么??
非常感谢。
关于第一个答案: 我想要一个特定的构造函数,它将迭代器作为参数(因为我已经有了将值和指针作为参数的构造函数)
编辑: 是这样的吗?
template<class T1, class T2> MyClass(std::iterator<T1, T2> first, std::iterator<T1, T2> last)
答案 0 :(得分:5)
...
可以是你想要的任何东西,它只是一个占位符名称,无论什么类型。我想你需要阅读a good book。
template<class Iter> MyClass(Iter first, Iter last)
如果类型应表示迭代器,则 Iter
是一个通用名称。另一个选项可能是InIt
,表示迭代器不应该是输出迭代器。
答案 1 :(得分:2)
我认为你可以利用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)