Должны ли параметры шаблона быть типами? - PullRequest
6 голосов
/ 23 сентября 2011

В Bjarne Stroustrup C ++ Book (глава 13, стр. 331) говорится, что «параметр шаблона может использоваться в определении последующего параметра шаблона». И это дает следующий код:

template<class T, T def_val> class Cont{ /* ... */ }

Может кто-нибудь привести пример использования этого шаблона. Например, как инициализировать объект Cont? Мне кажется, что "def_val" не является аргументом типа и не должен быть помещен в <>. Я не прав?

Большое спасибо

Ответы [ 4 ]

7 голосов
/ 23 сентября 2011

Вы можете сделать что-то вроде этого:

Cont<int, 6> cnt;
//        ^ as long as this is of type T (in this case int)
// def_val will be of type int and have a value of 6

Параметры шаблона не обязательно должны быть типами.

Это работает только тогда, когда T является целым типом (int, unsigned, long, char и т. Д., Но не float, std::string, const char* и т. Д.), Как @Riga упомянул в своем комментарии.

6 голосов
/ 23 сентября 2011

def_val является аргументом значения. Инстанциация может выглядеть так:

Cont<int, 1> foo;

Интересный случай, когда это полезно, когда вы хотите иметь указатель на члена класса в качестве шаблона:

template<class C, int C::*P>
void foo(C * instance);

Это позволяет создавать экземпляр foo с указателем на член типа int любого класса.

3 голосов
/ 23 сентября 2011

Вот пример того, как создать экземпляр выше:

template<class T, T def_val> class Cont{ /* ... */ };

int main()
{
    Cont<int,42> c;
}
2 голосов
/ 23 сентября 2011

T def_val - это объект типа T (который был ранее передан).Например, его можно использовать для инициализации элементов в контейнере.Для использования это будет выглядеть примерно так:

Object init(0);
Cont<Object, init> cont;

(псевдо-код; Object, очевидно, должен быть типом, допустимым для использования таким образом)

Затем используется второй параметр шаблона.Он включен в шаблон, потому что имеет шаблонный тип;def_val должен иметь тип T и должен передаваться при создании объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...