早期参数依赖的默认模板参数是否有效?

5
例如,以下代码片段在VC++ 2010中编译通过:
template<int Rows, int Columns = Rows>
struct Matrix {  };

Matrix<4> m;

请注意,Columns 的默认参数取决于 Rows 的参数值。
但在 C++11(或更早的版本)中,这是否是我可以在任何地方都依赖的“标准”行为?
2个回答

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;

2
根据 C++,是的:
也可以为类模板参数设置默认值或类型。例如,如果先前的类模板定义如下:
template <class T=char, int N=10> class mysequence {..};

更加平凡的是,使用 g++ -Wall 可以编译它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接