【发布时间】:2014-08-19 05:52:03
【问题描述】:
如何(如果可能)使用 c++11 可变参数编程在函数体中定义一系列 vector,(或者换句话说,一系列 N 维数组,@ 递减987654323@'s 直到 0),像下面的变量?
vector<vector<vector<int>>> v<3>;
vector<vector<int>> v<2>;
vector<int> v<1>;
int v<0>;
我的想象是这样的:
#include <iostream>
#include <vector>
using namespace std;
template<int ...> struct seq {};
template<int N, int ...S> struct gens : gens<N-1, N-1, S...> {};
template<int ...S> struct gens<0, S...>{ typedef seq<S...> type; };
template<int ...S>
void f(seq<S...>) {
//how do I write definitions of v<N> here?
vector<vector<...(N layers)<vector<int> ...> v<N>; //??how-to, not valid c++
vector<vector<...(N -1 layers)<vector<int> ...> v<N-1>;//??how-to, not valid c++
//...
vector<int> v<1>; //??how-to, not valid c++
int v<0>; //??how-to, not valid c++
//...
}
int main() {
f(typename gens<3>);
return 0;
}
另外,这在 c++14 中会更容易吗?
谢谢,
--编辑--
澄清一下,我所说的“向量塔”最好用 N 元组 (v_1, v_2, ..., v_N) 来描述,其中 N 是一个积分模板参数。 v_1 属于向量,v_2 属于向量>,以此类推。
--EDIT2--
到目前为止,quantdev 和 R 的答案已经成功解决了为任何固定的 N 定义 N 元组的问题,例如 3,但无法为未指定的 N 生成元组。除了答案中的功能之外,我还需要一个可以像gen_tower<N> 一样使用的函数,它返回tuple(v1,v2,...,vN)。
考虑使用可变参数编程计算阶乘的示例。除了手动写出任何特定表达式<1*2*3> 的能力之外,我还需要一个函数来计算任何N 的阶乘factorial<N>()。 (这就是为什么我询问可变参数编程以及c++14 是否会使其更容易的原因。)
附言
纯粹出于个人兴趣,我希望这个序列能够实现一个可以从文件中读取 N 维数组的通用函数。我还不知道具体怎么做,但我认为在第一步,我应该能够定义最终的N 维数组,以及从N-1 到@ 的k 的中间k 维数组987654337@。我可以读取二维数组和 3 维。但是能读取任意维度的数组就好了。
【问题讨论】:
-
您能否举例说明您打算如何使用这些 N 个数组,或者定义它们是一个练习?
-
@Alf,这纯粹是出于个人利益。请参阅 P.S. 中的更新。干杯。
标签: c++ templates c++11 metaprogramming c++14