C++模板可变参数但静态

Nob*_*ody 3 c++ variadic-templates c++11

我正在用C++培训我的模板技能,并希望实现一个矢量类.该类由向量维N和类型T定义.现在我想要一个构造函数,它完全采用类型为T的N个变量.但是我无法理解如何告诉可变参数模板只接受N参数.也许这可以通过模板专业化来实现?或者我在想错误的方向?任何关于此的想法/想法将不胜感激.

更多的想法

我已经看到的可变参数模板上的所有示例都使用递归来"迭代"参数列表.但是我记得构造函数不能从构造函数中调用(阅读答案中的注释).也许甚至不可能在构造函数中使用可变参数模板?无论如何,这只会让我使用具有相同基本问题的工厂功能.

Luc*_*ton 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];
};
Run Code Online (Sandbox Code Playgroud)

此示例使用完美转发,并且static_assert如果没有将完全Size参数传递给构造函数,则生成硬错误.这可以调整:

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