Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;可变但静态的模板 我正在训练C++中的模板技巧,并希望实现一个向量类。 该类由向量维数N和类型T定义。 现在我想有一个构造函数,它只接受N个类型为T的变量。 然而,我无法理解如何告诉变量模板只接受N个参数。也许这可以通过模板专门化实现? 还是我想的方向不对? 如对此有任何想法/想法,将不胜感激_C++_C++11_Variadic Templates - Fatal编程技术网

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
参数传递给构造函数的不准确。这可以调整:

  • 您可以使用
    std::enable_if
    (触发SFINAE)将硬错误转换为软错误;我不推荐

  • 您可以将条件更改为
    sizeof…(U)非常好,我没有想到通过列表初始化。这就解决了递归问题。有没有一个@尼姆:他已经将T用于另一个类型,所以将它的后继类型作为下一个typename是唯一的逻辑。@Nim
    U
    是构造函数的模板参数(它是模板的成员模板)。使用
    T
    将意味着隐藏
    vector
    的模板参数,这是不允许的。@任何构造函数都不能调用C++11中的其他构造函数(此功能称为“委托构造函数”;请在上查找它,例如,以便了解更多信息),您可以使用这些参数进行递归(但我认为变量助手在这里就足够了)。请注意,目前还没有多少编译器支持该功能。我不推荐递归,因为递归构造数组很麻烦。当然不再有递归了,这就是我的意思:)至于你的最后一点:是否需要采取任何额外的步骤来允许将类型转换为T作为参数,或者这仅仅是默认类型检查的结果?@现在没有人使用完美转发意味着如果
    T
    可以从
    U
    构造(对于所有
    U
    )然后一切顺利,否则会出现软错误。使用
    static\u assert
    意味着您可以使用自己的错误消息,并使其成为一个硬错误。所有这些都是在编译时完成的。嗯,我想吕克·丹顿在你编辑之前回答了你的问题,那么它是从哪里来的呢?@Griwes:是的,你说的“它从哪里来”是什么意思?@Griwes:现在我明白你的意思了^^我多次修改了我的措辞,所以我在看到他的帖子之前就开始编辑,但在他之后才完成。