如何展开此 C++ 模板参数包

How to expand this C++ template parameter package

提问人:noodle_run 提问时间:11/1/2023 更新时间:11/1/2023 访问量:90

问:

我想将模板参数包扩展为二维数组,但不知道如何实现

因为矩阵类的元素通常是浮点小数,但这只有C++20之后的语法支持

template<int Row, int Col, typename T = float>
struct MATRIX
{
    template<T... Args>
    MATRIX(Args... nums) : aNumbers{ (nums, 0)... }// this is error
    {
        //aNumbers = { (nums, 0)... };
    }

    T aNumbers[Row][Col];

我尝试了几种语法,但没有一个编译。我想实现一个具有可变长度模板参数的构造函数

C++ 模板 C++20 元编程

评论

2赞 HolyBlackCat 11/1/2023
你希望它如何工作?为了能够传递参数来初始化每个参数?那里面在做什么?Row*Col,0
0赞 463035818_is_not_an_ai 11/1/2023
“但这仅在 C++20 之后的语法支持”不清楚您的意思。矩阵可以有早在 c++20 之前的浮点元素。我想你指的是浮点非类型模板参数?
1赞 user12002570 11/1/2023
首先,是一个非类型的模板参数,所以是无效的。ArgsMATRIX(Args... nums)

答:

1赞 user12002570 11/1/2023 #1

MATRIX(Args... nums) : aNumbers{ (nums, 0)... }这是错误

问题是它是一个非类型的模板参数(variadic),因此您不能将其用作函数参数列表中的类型。换句话说,是无效的语法。ArgsMATRIX(Args... nums)

3赞 463035818_is_not_an_ai 11/1/2023 #2

您需要决定是希望元素是非类型模板参数(这需要 c++20)还是构造函数的普通参数。后者相当简单:

template<int Row, int Col, typename T = float>
struct MATRIX
{
    template <typename...X>
    MATRIX(X... nums) : aNumbers{ nums... }
    {

    }

    T aNumbers[Row][Col];
};

int main() {
    MATRIX<3,3,double> m{1.,2.,3.,4.,5.,6.,7.,8.,9.};
}

只是为了确保相等,需要一些额外的东西。不过,一步一个脚印,我认为这超出了问题的范围。X...T

在代码中:

template<T... Args>
MATRIX(Args... nums)

Args是构造函数的非类型模板参数,因此没有意义。Args...nums

评论

0赞 noodle_run 11/3/2023
谢谢,此代码不会自动转换类型。它使“编译器错误 C2397 从'int'到'T'的转换需要缩小转换范围”。