2011-10-11 49 views
3

我正在C++中训练我的模板技巧,并且想实现一个向量类。 该类由矢量维N和类型T定义。 现在我想要一个构造函数,它只需要T类型的N个变量。 但是,我无法理解如何将可变参数模板告诉给只接受N个参数。也许这是可能的模板专业化? 或者我在错误的方向思考? 任何想法/想法,将不胜感激。C++模板variadic但是静态的

更多的想法

我已经看到用递归“迭代”通过参数列表可变参数模板的例子。不过,我记得 构造函数不能从构造函数 中调用(请阅读答案中的注释)。所以也许它甚至不可能在构造函数中使用可变参数模板?无论如何,这只会推迟到使用具有相同基本问题的工厂功能。

+0

嗯,我认为Luc Danton在编辑之前已经回答了,所以它是从哪里来的? – Griwes

+0

@格里斯:是的,你说'它从哪里来的'是什么意思? – Nobody

+0

我的意思是你的编辑;) – Griwes

回答

8

一个可变参数的构造函数似乎是恰当的:

template<typename T, int Size> 
struct vector { 
    template<typename... U> 
    explicit 
    vector(U&&... u) 
     : data {{ std::forward<U>(u)... }} 
    { 
     static_assert(sizeof...(U) == Size, "Wrong number of arguments provided"); 
    } 

    T data[Size]; 
}; 

本例使用完美转发,并static_assert即使不完全Size参数传递给构造函数产生一个硬错误。这可以调整:

  • 您可以通过使用std::enable_if(触发SFINAE)将硬错误变成软错误;我不会推荐它
  • 你可以改变的条件是sizeof...(U) <= Size,让剩余的元素是值初始化
  • 可以要求传递给构造函数的类型转换为T,或完全匹配例如T const&;或者将违规转化为硬错误(再次使用static_assert)或软错误(再次使用SFINAE)
+0

为什么'U'而不是'T'? (出于兴趣)... – Nim

+0

非常好,我没有想到通过列表初始化。这解决了递归问题,如果有的话。那么有没有一个? ^^ @Nim:他已经将T用于另一种类型,所以将它的后继作为下一个类型名称是唯一的逻辑。 – Nobody

+0

@Nim'U'是构造函数的模板参数(它是模板的成员模板)。使用'T'意味着隐藏'vector'的模板参数并且不被允许。 –