假设我想声明一个向量,其中包含一个向量,其包含一个向量,一直到 n 维。
像这样:
using namespace std;
// for n=2
vector<vector<int> > v2;
// for n=3
vector<vector<vector<int> > > v3;
// for n=4
vector<vector<vector<vector<int> > > > v3;
是否有一种使用模板元编程的方法来处理任意 n 的问题?
是的,这很简单。
就像归纳证明一样,我们设置一个递归情况和一个(部分特化的)基本情况来结束递归。
template<size_t dimcount, typename T>
struct multidimensional_vector
{
typedef std::vector< typename multidimensional_vector<dimcount-1, T>::type > type;
};
template<typename T>
struct multidimensional_vector<0,T>
{
typedef T type;
};
multidimensional_vector<1, int>::type v;
multidimensional_vector<2, int>::type v2;
multidimensional_vector<3, int>::type v3;
multidimensional_vector<4, int>::type v4;
T
,以便允许传递其他内容到 std::vector
(它接受额外的默认参数)。 - bitmaskstd::vector
本身具有相同的默认值。但在罕见情况下,如果需要非标准分配器,则可能适用于此类的所有用法,在这种情况下,它可以直接放入递归typedef行中。 - Ben Voigtconstexpr
。 - Jon Deaton