【问题标题】:How can I implement a class which can be constructed with an input iterator?如何实现一个可以用输入迭代器构造的类?
【发布时间】:2013-08-09 05:10:30
【问题描述】:

std::vector 类有一个方便的构造函数,它允许任何输入迭代器为其参数。我想在我自己的类中实现类似的模式,因为该类在实例化时需要接受一些集合,但我希望在该集合上使用迭代器以进行封装。我想到的一种方法是使用输入迭代器类型对整个类进行模板化,但这不能是 STL 所做的,因为 vector 显然只使用被迭代的类型进行模板化。当然,一个选项是模板化生成器函数,但我真的很想知道实现 STL 的编译器是如何完成它的 - 不知何故,InputIterator 类型是仅特定于构造函数的类型名,即使构造函数不能被模板化。

(是的,我试过看vector.tpp,但看不懂)。

【问题讨论】:

  • "即使构造函数不能被模板化。"就是这样 - 他们可以成为,而这正是 vector 所做的。
  • @jrok 好吧,那看起来很容易。那么this question 到底是什么?
  • 构造函数的模板参数需要推导,因为无法明确指定。
  • @jrok 在那种情况下,我的问题似乎很微不足道 - 有什么理由坚持下去吗?
  • @VF1:仍然是一个完全合理的问题,明确且容易找到,并且有明确的答案。如果你删除它,以后会有人问它。

标签: c++


【解决方案1】:

你的类应该有一个模板化的构造函数(在迭代器类型上模板化):

class my_class {

    template <typename InputIterator>
    my_class(InputIterator first, InputIterator last) {
        // ...
    }

    // ...
};

【讨论】:

  • 我真的很想试试这个,但this question 阻止了我这样做。
  • @VF1 OP 在该问题中想要的重要要求是我希望有一个带有模板构造函数的非模板类没有参数 .这是无法做到的,因为正如 James 的回答所说,对于模板化的构造函数,必须推导出模板参数。
  • @VF1:您提供的参考文献中的问题是关于一个不带任何参数的模板化构造函数。在您的情况下,它确实需要至少一个(或更可能两个)。无论如何,我在帖子中所解释的正是 STL 容器的作用。
  • @VF1 当你实现这个时,还要注意像this one 这样的陷阱,模板化的构造函数可能会比另一个构造函数更匹配(直觉上你会认为它会更好)匹配)
  • @Praetorian 感谢您的建议。我目前的工作只有一个构造函数,但我会记住你所说的以备将来使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 2021-05-02
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
相关资源
最近更新 更多