4

我正在创建一个类,它是一种容器,我想创建一个构造函数,它可以采用“第一个”和“最后一个”迭代器,如 std::vector 和其他标准容器。什么是正确的语法?(我想要一个模板,一个可以采用任何可用的第一个/最后一个迭代器类型的函数(就像我认为的标准库)。非常感谢!

例如,我想要这样的东西:

template<class ...> MyClass(... first, ... last) 

但是……是什么?

非常感谢你。

关于第一个答案:我想要一个将迭代器作为参数的特定构造函数(因为我已经有将值和指针作为参数的构造函数)

编辑:这样可以吗?

template<class T1, class T2> MyClass(std::iterator<T1, T2> first, std::iterator<T1, T2> last)
4

2 回答 2

6

...可以是任何你想要的,它只是一个占位符名称,用于任何类型。我认为你需要读一本好书

template<class Iter> MyClass(Iter first, Iter last)

Iter如果类型应表示迭代器,则为通用名称。另一种选择可能是InIt指示迭代器不应是输出迭代器。

于 2012-05-27T01:10:13.793 回答
3

我认为你可以利用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)
于 2012-05-27T01:44:11.160 回答