C++;可变但静态的模板 我正在训练C++中的模板技巧,并希望实现一个向量类。 该类由向量维数N和类型T定义。 现在我想有一个构造函数,它只接受N个类型为T的变量。 然而,我无法理解如何告诉变量模板只接受N个参数。也许这可以通过模板专门化实现? 还是我想的方向不对? 如对此有任何想法/想法,将不胜感激
更多想法C++;可变但静态的模板 我正在训练C++中的模板技巧,并希望实现一个向量类。 该类由向量维数N和类型T定义。 现在我想有一个构造函数,它只接受N个类型为T的变量。 然而,我无法理解如何告诉变量模板只接受N个参数。也许这可以通过模板专门化实现? 还是我想的方向不对? 如对此有任何想法/想法,将不胜感激,c++,c++11,variadic-templates,C++,C++11,Variadic Templates,更多想法 我已经看到的关于可变模板的所有示例都使用递归来“迭代”参数列表。但是我认为构造函数不能从构造函数中调用(请阅读答案中的注释)。所以在构造函数中甚至不可能使用可变模板?无论如何,这只会使我推迟使用具有相同基本问题的工厂函数。变量构造函数似乎合适: template<typename T, int Size> struct vector { template<typename... U> explicit vector(U&&
我已经看到的关于可变模板的所有示例都使用递归来“迭代”参数列表。但是我认为构造函数不能从构造函数中调用(请阅读答案中的注释)。所以在构造函数中甚至不可能使用可变模板?无论如何,这只会使我推迟使用具有相同基本问题的工厂函数。变量构造函数似乎合适:
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];
};
模板
结构向量{
模板
明确的
向量(U&…U)
:数据{{std::forward(u)…}
{
static_assert(sizeof…(U)=Size,“提供的参数数量错误”);
}
T数据[大小];
};
本例使用完美转发和static\u assert
生成硬错误,如果Size
参数传递给构造函数的不准确。这可以调整:
- 您可以使用
(触发SFINAE)将硬错误转换为软错误;我不推荐std::enable_if
- 您可以将条件更改为
sizeof…(U)非常好,我没有想到通过列表初始化。这就解决了递归问题。有没有一个@尼姆:他已经将T用于另一个类型,所以将它的后继类型作为下一个typename是唯一的逻辑。@Nim
是构造函数的模板参数(它是模板的成员模板)。使用U
将意味着隐藏T
的模板参数,这是不允许的。@任何构造函数都不能调用C++11中的其他构造函数(此功能称为“委托构造函数”;请在上查找它,例如,以便了解更多信息),您可以使用这些参数进行递归(但我认为变量助手在这里就足够了)。请注意,目前还没有多少编译器支持该功能。我不推荐递归,因为递归构造数组很麻烦。当然不再有递归了,这就是我的意思:)至于你的最后一点:是否需要采取任何额外的步骤来允许将类型转换为T作为参数,或者这仅仅是默认类型检查的结果?@现在没有人使用完美转发意味着如果vector
可以从T
构造(对于所有U
)然后一切顺利,否则会出现软错误。使用U
意味着您可以使用自己的错误消息,并使其成为一个硬错误。所有这些都是在编译时完成的。嗯,我想吕克·丹顿在你编辑之前回答了你的问题,那么它是从哪里来的呢?@Griwes:是的,你说的“它从哪里来”是什么意思?@Griwes:现在我明白你的意思了^^我多次修改了我的措辞,所以我在看到他的帖子之前就开始编辑,但在他之后才完成。static\u assert