【问题标题】:C++ : syntax for passing iterator to a function?C++:将迭代器传递给函数的语法?
【发布时间】:2012-06-02 00:17:12
【问题描述】:

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

例如,我想要类似的东西:

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

但是……是什么?

非常感谢。

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

编辑: 这样的事情可以吗?

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

【问题讨论】:

  • 没有语法要求,但如果它暗示了类型概念,那就太客气了。类似InputIterator 或ForwardIterator...
  • 关于您的编辑:模板可以采用任何类型,因此您可以很好地传递迭代器,我不明白您的问题。
  • 我已经有一个如下形式的构造函数: template MyClass(T1 x, T2 y) 我想要一个特定的迭代器构造函数。但我不知道声明泛型迭代器的语法...
  • 那么你的设计有很大的问题。正如我在回答中指出的那样,“通用迭代器”类型只是一个模板。您可以限制模板,以便 only 迭代器可以通过,但是您的其他构造函数会出现模棱两可的情况。其他构造函数具体用于什么?

标签: c++ iterator


【解决方案1】:

我认为你可以利用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)

【讨论】:

  • 太棒了!我不知道 SFINAE,它可能非常有用
  • 除了指针是完全有效的迭代器并且显然没有iterator_category typedef。
  • 实际上该语法解决了我的具体问题,但很好的一点 Xeo
  • @Xeo "指针是有效的迭代器" 真的取决于你对迭代器的定义。如果将其定义为具有std::iterator 的成员,那么指针就不是一个很好的迭代器
  • iterator_traits 完全适用于这种情况。这就是为什么你应该使用typename iterator_traits&lt;Iter&gt;::iterator_category 而不仅仅是Iter::iterator_category。
【解决方案2】:

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

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

Iter 是一个通用名称,如果该类型应该表示一个迭代器。另一个选项可能是InIt,表示迭代器不应是输出迭代器。

【讨论】:

  • 不是我,但也许应该是 typename Iter?
  • @helloworld922:不,class 和 typename 在用于模板参数时是同义词。但是请注意,当您有一个模板模板参数时,您只能使用class:template&lt;template&lt;typename&gt; class TemplClass&gt;。
  • @helloworld922,两者本身都不比另一个好。这门课有点剩下了。
  • class 在这里工作正常。在Modern C++ Design中,Andre 建议在可以传递任何类型时使用typename,在需要用户定义类型时使用class,但这似乎从未真正流行起来.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2014-06-26
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
相关资源
最近更新 更多