Вложенные имена в шаблонах - PullRequest
0 голосов
/ 03 января 2012

Я хотел бы написать шаблон функции следующим образом:

template< typename L<T> >  // does not work
void do_sth(L<T>& list){
    T value = 0;
    list.push_back(value);
}

Это означает, что в шаблоне я хотел бы работать с контейнерами, предлагающими «push_back», но также с типом, хранящимся внутриэтот контейнер.

Обходной путь будет

template< typename T >
void do_sth(typename std::list<T>& list){
    T value = 0;
    list.push_back(value);
}

// call    
std::list<double> list;
do_sth<double>(list);

, что является избыточным, потому что a) я уже указал "double" при объявлении "list" и b) функция не будет работать с std:: vector, хотя реализация отлично подошла бы.

Кто-нибудь знает, как этого добиться?

Ответы [ 2 ]

6 голосов
/ 03 января 2012

Это одна из причин, по которой контейнеры STL предоставляют value_type typedef:

template< typename Container >
void do_sth(Container& list){
    typename Container::value_type value = 0;
    list.push_back(value);
}

Ваш обходной путь также будет работать с простым вызовом do_sth(list); из-за вывода аргумента шаблона.

2 голосов
/ 03 января 2012

Вы можете сделать это так:

template< typename T >
void do_sth( T & list){
    typename T::value_type value = 0;
    list.push_back(value);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...