我正在用 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/