提问人:noodle_run 提问时间:11/1/2023 更新时间:11/1/2023 访问量:90
如何展开此 C++ 模板参数包
How to expand this C++ template parameter package
问:
我想将模板参数包扩展为二维数组,但不知道如何实现
因为矩阵类的元素通常是浮点小数,但这只有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];
我尝试了几种语法,但没有一个编译。我想实现一个具有可变长度模板参数的构造函数
答:
1赞
user12002570
11/1/2023
#1
MATRIX(Args... nums) : aNumbers{ (nums, 0)... }
这是错误
问题是它是一个非类型的模板参数(variadic),因此您不能将其用作函数参数列表中的类型。换句话说,是无效的语法。Args
MATRIX(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'的转换需要缩小转换范围”。
评论
Row*Col
,0
Args
MATRIX(Args... nums)