2013-08-07 34 views
3

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

(是的,我试图看看vector.tpp,但我无法理解它)。

+3

这就是事情 - 它们*可以是,而这正是'矢量'所做的。 – jrok

+0

@jrok好吧,那似乎很容易。什么是[这个问题](http://stackoverflow.com/questions/3960849/c-template-constructor)所有关于那么? – VF1

+0

构造函数的模板参数需要被推断,因为没有办法明确指定它们。 – jrok

回答

5

你的类应该有一个模板构造函数(模板的迭代器类型):“即使构造函数不能被模板”

class my_class { 

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

    // ... 
}; 
+0

我真的想试试这个,但[这个问题](http://stackoverflow.com/questions/3960849/c-template-constructor)阻止我这样做。 – VF1

+0

@ VF1 OP在这个问题上需要的重要要求是*我希望有一个模板构造函数的非模板类**,没有参数***。这是做不到的,因为正如詹姆斯的回答所述,对于模板化的构造函数,必须推导出模板参数。 – Praetorian

+0

@ VF1:您提供的参考中的问题是关于一个模板化的构造函数,它不会接受任何参数**。在你的情况下,它至少需要一个(或更可能两个)。无论如何,我在文章中解释的正是STL容器所做的。 –

相关问题