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

问题描述 投票:0回答:1

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

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”:不是非类型模板参数“TMATRIX”的有效类型 MSVC .34.31933\include uple(232,40): 消息: 'tuple' 不是 a

错误 C2641:无法推导“CTestMatrix”的模板参数

错误 C2783:“CTestMatrix CTestMatrix(void)”:无法推导模板>

消息:请参阅“CTestMatrix”的声明

错误 C2780:'CTestMatrix CTestMatrix(CTestMatrix)':> >

消息:请参阅“CTestMatrix”公共基类的声明

需要 1 个参数 - 0 个为“TROW”提供的参数

c++ templates template-meta-programming
1个回答
0
投票

正如错误所述,您不能使用元组作为模板参数。另外,您不能将包作为元组返回,这些是不同的东西。

正确的代码是这样的:

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...}; }
};

如果您想发送一个包含所有值的非类型模板参数,您可以在 C++20 中:

template<std::array data>
struct CTestMatrix
{
    constexpr decltype(data) GetData() { return data; }
};

并这样使用它:

CTestMatrix<{
    'A', 'B', 'C', 'D', 'E',
    'A', 'B', 'C', 'D', 'E',
    'F', 'G', 'H', 'I', 'J',
    'K', 'L', 'M', 'N', 'O',
}> cTestMatrix{};
© www.soinside.com 2019 - 2024. All rights reserved.