c++模板可变但静态

C++ Templates variadic but static

本文关键字:静态 c++      更新时间:2023-10-16

我在c++中训练我的模板技能,并想实现一个向量类。类由向量维N和类型T定义。现在我想要一个构造函数,它正好有N个类型为T的变量。然而,我不能得到我的头围绕如何告诉可变模板只接受N个参数。也许这是可能的模板专门化?还是我想错方向了?如有任何意见,我将不胜感激。

更多想法

我已经看到的所有关于可变模板的例子都使用递归来"迭代"参数列表。然而,我想到的是构造函数不能从构造函数调用(阅读答案中的评论)。所以也许在构造函数中使用可变模板是不可能的?无论如何,这只会推迟我使用工厂函数来解决相同的基本问题。

一个可变的构造函数似乎是合适的:

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)