Создание экземпляра шаблона C ++ с идентификатором - PullRequest
3 голосов
/ 09 июня 2010

Я столкнулся с еще одной проблемой, которую я не понимаю.

Следующее не создает (экземпляр не работает), почему?

template<class E>
void operator[](typename boost::mpl::identity<E>::type e) const;

спасибо за вашу помощь

Ответы [ 2 ]

10 голосов
/ 09 июня 2010

identity может использоваться для принудительного указания аргумента шаблона в явном виде. Это эффективно предотвращает участие этого параметра функции в выводе аргумента шаблона.

Квалифицированное имя типа является одним из не выведенных контекстов; то есть identity<E>::type не будет использоваться для вывода параметра шаблона для E.

Например, если у вас есть:

template<class E>
void f(typename boost::mpl::identity<E>::type e) { }

f(42);      // won't work
f<int>(42); // works
0 голосов
/ 09 июня 2010

Это кажется ужасно излишним. identity<E>::type гарантированно эквивалентно E, так почему бы просто не объявить ваш шаблон как:

template<class E>
void operator[](E e) const;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...