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