C++ 模板可变但静态

标签 c++ c++11 variadic-templates

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

更多想法

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

最佳答案

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

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];
};

这个例子使用完美转发 and and static_assert如果不完全是 Size,则生成硬错误参数传递给构造函数。这可以调整:

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

关于C++ 模板可变但静态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7725467/

相关文章:

c++ - 在多个线程中递减索引

c++ - 多重继承和可变参数模板

c - Ada 中的可变参数函数(C - Ada 绑定(bind))?

C++函数编码

c++ - 如何在 VSCode 中的 switch-case 语句中自动缩进?

python - 如何从PyObject str获取char字符串?

c++ - QAbstractItemDelegate悬停和(重新)绘制

c++ - 我可以在 lambda 捕获子句中声明一个变量吗?

c++ - 工业级n吨基类模板

c++ - 引用数据类型的可变参数模板