提问人:Anand Rathi 提问时间:9/27/2023 更新时间:9/28/2023 访问量:67
C++ 模板类型和该类型的可变参数数据
C++ template type and variadic data of that type
问:
我正在尝试创建一个编译时矩阵作为模板参数
template<typename TROW, TROW... TMATRIX>
struct CTestMatrix
{
constexpr std::tuple<TROW...> GetData() { return TMATRIX; }
};
int main()
{
CTestMatrix<decltype(std::make_tuple('A', 'B', 'C', 'D', 'E')),
std::make_tuple('A', 'B', 'C', 'D', 'E'),
std::make_tuple('F', 'G', 'H', 'I', 'J'),
std::make_tuple('K', 'L', 'M', 'N', 'O'),
> cTestMatrix{};
return 0;
}
我收到此错误。.
错误 C2993:“std::tuple<char,char,char,char,char>”:不是非类型模板参数“TMATRIX”的有效类型 MSVC\14.34.31933\include\tuple(232,40):消息:“tuple<char,char,char,char>”不是
错误 C2641:无法推断“CTestMatrix”的模板参数
错误 C2783:“CTestMatrix<TROW,TMATRIX...> CTestMatrix(void)':无法推断模板>
message : 参见 'CTestMatrix' 的声明
错误 C2780:“CTestMatrix<TROW,TMATRIX...> CTestMatrix(CTestMatrix<TROW,TMATRIX...>)': > >
message :参见“CTestMatrix”公共基类的声明
需要 1 个参数 - 0 个 provided参数用于“TROW”参数
答:
1赞
Guillaume Racicot
9/27/2023
#1
正如错误所说,您不能使用元组作为模板参数。此外,您不能将包作为元组返回,这些是不同的东西。
正确的代码是这样的:
CTestMatrix<char,
'A', 'B', 'C', 'D', 'E',
'A', 'B', 'C', 'D', 'E',
'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O',
> cTestMatrix{};
和班级:
template<typename TROW, TROW... TMATRIX>
struct CTestMatrix
{
constexpr std::array<TROW, sizeof...(TMATRIX)> GetData() { return {TMATRIX...}; }
};
如您所见,包不能按原样使用。您必须将其扩展为有效代码。 是一种产生包大小的包扩展类型。 将逐个展开每个元素,逗号分隔。折叠表达也是一种扩展形式。sizeof...
<pack>...
就其本身而言,包不是可以在代码中使用和操作的实体,除非通过扩展它。
如果要发送一个包含所有值的非类型模板参数,可以在 C++20 中:
template<std::array data>
struct CTestMatrix
{
constexpr decltype(data) GetData() { return data; }
};
并按如下方式使用它:
CTestMatrix<{
std::array{'A', 'B', 'C', 'D', 'E'},
std::array{'A', 'B', 'C', 'D', 'E'},
std::array{'F', 'G', 'H', 'I', 'J'},
std::array{'K', 'L', 'M', 'N', 'O'},
}> cTestMatrix{};
评论
0赞
Jarod42
9/27/2023
array<array<..>, ..>
似乎更适合 Matrix。(或带有平面数组的维度参数)。
0赞
Guillaume Racicot
9/28/2023
@Jarod42当然。我没有注意到 OP 的代码有嵌套元组
评论
std::tuple
std::tuple