gpt4 book ai didi

c++ - 可变参数模板参数包,仅接受无符号整数或size_t作为其类型

转载 作者:行者123 更新时间:2023-11-30 02:27:11 24 4
gpt4 key购买 nike

我正在尝试使用带有可变参数的一组模板类。我前面有几种选择可以选择。在声明或定义任何模板之前,我目前具有以下原型(prototype):我对模板很熟悉,但是在使用模板时我对可变参数类型没有太多的经验,因此语法有时确实会使我感到困惑。由于它们都是空壳,因此它们当前正在编译。

template<typename ClassType, typename... Args>  class MatrixReference;
template<typename ClassType, typename... Args> class MatrixStorage;
template<typename ClassType, typename... Args> class MatrixAllocation;

我有一个User End Class,将根据使用意图使用这些类;目前,它是一个空壳,直到我用适当的行为正确定义了其他类:
template<typename ClassType, typename... Args>
class Matrix {
};

上面显示的原型(prototype)中的其余类将继承自基类,以便上述用户类将包含一个容器,以便该容器为: std::vector<std::unique_ptr<MatrixBase>>std::vector<shared_ptr<MatrixBase>>,并且 vector 将仅包含来自以下类型的每种类型的1列出的原型(prototype)。例如,vector [0]将包含MatrixStorage,vector [1]将包含MatrixReference,而vector [2]将包含MatrixAllocation。顾名思义,每个类别都有不同的职责。存储类将包含元素的原始堆栈副本。引用类将用于引用这些副本。当元素在堆上声明时,将使用分配类。基类如下所示:
template <typename ClassType = void>
class MatrixBase {
protected:
MatrixBase(){}
virtual ~MatrixBase(){}
}; // Matrix

我还考虑过要从非模板基继承它们,因为此类不做任何事情,但其目的是能够将不同的类类型存储到单个容器中。我可能会继续将其更改为非模板类​​型,但现在我将按原样使用它,以遵循其派生类型的约定。

现在讲我的类模板的声明:我真的只需要在其中使用其中一个,因为它们都遵循相同的模式,但是无论如何我都将显示这三个模板,因为它们当前是空的shell。
// Stores All Of The Contents Of The Matrix
template<typename ClassType, typename... Args>
class MatrixStorage : public MatrixBase<ClassType> {
}; // MatrixStorage

// Used To Reference The Storage Class Of The Matrix
template<typename ClassType, typename... Args>
class MatrixReference : public MatrixBase<ClassType> {
}; // MatrixReference

// Used Only When User Wants To Create A Matrix On The Heap
template<typename ClassType, typename... Args>
class MatrixAllocation : public MatrixBase<ClassType> {
}; // MatrixAllocation

我正在寻找的设计方法是,使用此类时,它遵循以下模式:第一种类型始终是矩阵将存储为int,float或其他用户定义类型的数据类型;下一个参数是使用可变参数的地方,因此,如果这样实例化模板:
Matrix<float,2,2> mat2x2; // Default constructor making it empty

这将生成一个2x2大小的浮点矩阵
Matrix<int,3,3,3> mat3x3x3; 

这将生成一个3x3x3的整数体积矩阵

因此,可变参数模板部分将始终为+整数,并且最低要求为 Matrix<type, 1>,在某种意义上这将是标量或单个元素矩阵或1x1矩阵。

这是为我提供的一些选项。我可以使用以下
  • size_t ... N
  • unsigned ... D
  • 类型名称... Args

  • 如您所见,目前,它是使用最后一个选项声明的。现在是主要问题:

    如果我决定在有帮助类的地方使用Parameter Pack:
    template <typename ClassType,typename... Dimensions>
    class DimensionPack {
    public:
    typename std::tuple<ClassType, std::tuple<Dimensions...> >::type Dim;
    const unsigned int numarguments = sizeof...(Dimensions);
    };

    问题变成了;有没有一种已知的方法可以使可变参数的类型相同,即 size_tunsigned int?如果是这样,将不胜枚举示例,或者引用链接也将有所帮助;我已经搜索过,但是没有找到任何有用的东西,足以帮助我解决这个问题。

    如果没有,我不介意使用 size_tunsigned int,但我更希望能够使用helper模板为我打包和解压缩可变参数,这样我就不必在每个和每堂课。

    我也有另外两个未在此处显示的派生类,但是一个将用于将它们记录到屏幕上,而另一个将用于从文件中读取和解析并写出到文件中。

    另外请注意:对于超大型数据集或超大型矩阵:我也可以使用此帮助器类:
    template<typename ClassType, std::size_t bufferSize>
    class MatrixBuffer {
    static std::vector<ClassType> matrixBuffer = std::vector<ClassType>().reserve( bufferSize );
    };

    编辑

    我忘记将其添加到原始问题中,但是现在添加它是为了使内容更加清晰。我确实需要测试每个可变参数的值,看它是否为奇数或偶数,并将它们的结果存储到一个 vector 中,该 vector 的大小与偶数为0或奇数为1的参数的大小相同。这就是我之所以倾向于使用参数包的原因之一,因为我可以将其传递给一个辅助函数,该函数将返回所需的 vector 。

    最佳答案

    std::size_t... Argstypename... Args不相同。第一个期望整数喜欢

    Matrix<float,2,2> mat2x2;

    而第二个期望 改为
    当然,您可以使用 std::integral_constant,但是会更加冗长:
    template <std::size_t N>
    using size = std::integral_constant<std::size_t, N>;

    Matrix<float,size<2>,size<2>> mat2x2;

    另一方面,您可以使用 std::index_sequence:
    template<typename ClassType, std::size_t... Dims>
    class Matrix {
    using Dimensions = std::index_sequence<Dims...>;
    };

    关于c++ - 可变参数模板参数包,仅接受无符号整数或size_t作为其类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41993864/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com