Допустимо ли иметь аргументы шаблона по умолчанию, которые зависят от более ранних аргументов?

Например, следующий фрагмент кода компилируется в VC ++ 2010:

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

Matrix<4> m;

Обратите внимание, что аргумент по умолчанию для Columns зависит от значения аргумента для Rows,

Но это стандарт поведение в C ++ 11 (или ранее), на которое я могу положиться везде?

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;
4

Другие решения

В соответствии с cplusplus, да:

Также возможно установить значения или типы по умолчанию для параметров шаблона класса. Например, если предыдущее определение шаблона класса было:

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

И на более простом замечании, g ++ -Wall скомпилирует его.

2

По вопросам рекламы [email protected]