C++ 模板类型和该类型的可变参数数据

C++ template type and variadic data of that type

提问人:Anand Rathi 提问时间:9/27/2023 更新时间:9/28/2023 访问量:67

问:

我正在尝试创建一个编译时矩阵作为模板参数

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”参数

C++ 模板 template-元编程

评论

0赞 wohlstad 9/27/2023
正如错误所说,您不能用作非类型模板参数。std::tuple
0赞 Anand Rathi 9/28/2023
@wohlstad为什么不呢?
1赞 wohlstad 9/28/2023
不是任何类型都可用于 NTTP。您可以在此处查看要求。老实说,我没有分析所有要求,但我认为不能满足它们。std::tuple

答:

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 的代码有嵌套元组