3

我正在用 C++ 训练我的模板技能,并希望实现一个向量类。该类由向量维度 N 和类型 T 定义。现在我想要一个构造函数,它恰好采用 N 个类型为 T 的变量。但是我不知道如何告诉可变参数模板只接受 N参数。也许这可以通过模板专业化实现?还是我想错了方向?对此的任何想法/想法将不胜感激。

更多想法

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

4

1 回答 1

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)
于 2011-10-11T11:52:40.640 回答