C++ 可变模板与构造函数

C++ 可变模板与构造函数,c++,arrays,C++,Arrays,我在写一个类,它将特定的多维数组映射到一维数组(比如2D数组N×M大小就像一维数组NM大小,你知道,然后你可以通过[N+mN]访问单元格[N,M])。这很无聊,因为我必须处理任何多维数组(被迫多次复制/粘贴类定义) 在我的例子中,我发现了一些很棒的东西:可变模板函数。 我想让我的构造函数和访问器使用可变模板,这样我的访问器可以使用任意数量的参数(2个用于2D数组,3个用于3D数组…),我的构造函数也可以使用相同的参数,因为我需要保存每个维度的大小(N,M…),然后乘以以获得我的一维数组的大小 问

我在写一个类,它将特定的多维数组映射到一维数组(比如2D数组N×M大小就像一维数组NM大小,你知道,然后你可以通过[N+mN]访问单元格[N,M])。这很无聊,因为我必须处理任何多维数组(被迫多次复制/粘贴类定义)

在我的例子中,我发现了一些很棒的东西:可变模板函数。 我想让我的构造函数和访问器使用可变模板,这样我的访问器可以使用任意数量的参数(2个用于2D数组,3个用于3D数组…),我的构造函数也可以使用相同的参数,因为我需要保存每个维度的大小(N,M…),然后乘以以获得我的一维数组的大小

问题是我不知道怎么做:( 我找到的每个示例都依赖于两个函数,一个函数的类型为
T
,另一个函数的类型为
T
Args…Args

在一个功能中可能吗?没有递归? 我给了你我到目前为止所做的:

template <typename T, typename... Args>
T returner(T v, Args... args){
    return v;
}

template <typename T>
class Array{

    public:
    int* dim; //contain the size of each dimension
    T* array; //the actual array

    template<typename... Args>
    Array(Args... args){
        constexpr int size = sizeof...(Args);
        dim = new int[size];
        for(int i=0; i<size; i++)
            dim[i] = returner(args...);
            /*dim[0] should be equal to the first argument, dim[1]
            should be equal to the second argument and so on */
    }
};

int main(){
    Array<int>(2,2,2); // meant to be a 3D array, 2cells in each dimension
    return 0:
}
模板
T返回器(T v,Args…Args){
返回v;
}
模板
类数组{
公众:
int*dim;//包含每个维度的大小
T*array;//实际数组
模板
数组(Args…Args){
constexpr int size=sizeof…(Args);
dim=新整数[大小];

对于(int i=0;i这应该满足您的要求(如果我理解正确):


这应该满足您的要求(如果我理解正确):


你能给我们展示一个你试图创建一个
数组的例子吗?(你通常把什么作为
参数传递…
?)?因为我不明白你想在这里做什么…我编辑了我的消息,希望它能回答你的问题。你能给我们展示一个你试图创建
数组的例子吗(你通常以
Args…
的形式传递什么?)因为我不明白你想在这里做什么…我编辑了我的消息,希望它能回答你的问题。是的:)谢谢,我没想到我会用这种方式初始化数组……谢谢;)@Viridia对于
dim
array
,您可能应该在这里使用
std::vector
,这会为您节省很多麻烦。@Viridia这真的是您想要的吗?我把您的问题理解为如果您使用
array(2,2,2)
那么大小应该是8,而不是3正确吗?@Viridia您可以循环,或者
std::accumultium(std::begin(dim),std::end(dim),1,std::乘{})
(假设您使用的是
std::vector
)@viridia在某些情况下,使用
begin(dim)
(实际上没有
std:
)更通用,因此如果
dim
是一个标准容器,一个原始数组(
int[4]
),或具有
begin
函数的用户定义容器。在这种情况下,它不会更改任何内容;)看。耶啊:)谢谢,没想到我会用这种方式初始化一个数组实际上…谢谢;@viridia你可能应该在这里用
std::vector
来处理
dim
array
,这会帮你省去很多麻烦。@viridia这真的是你想要的吗?我把你的问题理解为如果你使用
array(2,2,2)
那么大小应该是8,而不是3正确吗?@viridia您可以循环,或者
std::acculate(std::begin(dim),std::end(dim),1,std::multiples{})
(假设您使用的是
std::vector
)。@viridia在某些情况下,使用
begin(dim)
(实际上没有
std:
),这样,如果
dim
是标准容器、原始数组(
int[4]
)或具有
begin
函数的用户定义容器,则代码可以工作。在这种情况下,它不会更改任何内容;)请参阅。
template <typename T>
class Array{

    public:
    int* dim; //contain the size of each dimension
    T* array; //the actual array

    template<typename... Args>
    Array(Args... args){
        constexpr int size = sizeof...(Args);
        dim = new int[size]{args...};
    }
};
template <typename T>
class Array{

    public:
    std::vector<int> dim; //contain the size of each dimension
    std::vector<T> array; //the actual array

    template<typename... Args>
    Array(Args... args) : dim{args...} {

    }
};