拥有依赖于先前参数的默认模板参数是否有效?

时间:2013-02-16 05:37:05

标签: c++ templates default-parameters

例如,以下代码段在VC ++ 2010中编译:

template<int Rows, int Columns = Rows>
struct Matrix {  };

Matrix<4> m;

请注意Columns的默认参数取决于Rows的参数值。

但C ++ 11(或更早版本)中的标准行为是否可以依赖于任何地方?

2 个答案:

答案 0 :(得分:4)

是。事实上,它是多少STL代码的工作原理。

std::vector的定义如下:

 template < class T, class Alloc = allocator<T> > class vector

这样您就不必每次都指定allocator。如果这样无效,我们就无法写下:

std::vector<int> data;

您可以将std::map写为:

std::map < keyType,                                     // map::key_type
       ValType,                                       // map::mapped_type
       less<keyType>,                     // map::key_compare
       allocator<pair<const KeyType,ValType> >    // map::allocator_type
       > mapping;

远远不如:

std::map< keyType , ValType > mapping;

答案 1 :(得分:2)

根据cplusplus,是的:

也可以为类模板参数设置默认值或类型。例如,如果先前的类模板定义是:

template <class T=char, int N=10> class mysequence {..};

在一个更平凡的笔记中,g ++ -Wall将编译它。