Использование имен аргументов параметров шаблона шаблона
В коде
template < template<class TTP> class TP > ... // whatever
является TTP
тогда можно использовать где угодно? Не могу найти ссылку на то, что происходит с этими именами в Стандарте.
3 ответа
[Basic.scope.temp]/p1:
Декларативная область имени параметра шаблона для шаблона-параметра шаблона является наименьшим списком параметров-шаблонов, в который было введено имя.
Его можно использовать внутри этого списка, и все. Например,
template < template<class T, T t> class TP > class foo {};
// ^ ^-----T's scope ends here
// |
// T can be used here
foo<std::integral_constant> bar;
Вы можете получить к нему доступ, вы просто должны быть слегка косвенными об этом.
/--- don't bother giving this a name.
|
| Put it here instead ------------------\ |
| |
V V
template<template<typename, typename ...> class container_tmpl, typename value_t>
void foo(container_tmpl<value_t> x) {
std:: cout << __PRETTY_FUNCTION__ << std:: endl;
}
Точнее, если у вас есть объект типа vector<int>
и вы передаете это foo
выше, то foo
может получить доступ к соответствующим параметрам типа:
vector<int> v;
bar(v);
когда bar(v)
называется, тогда bar
"знает" первый параметр, который (я думаю?) ваша цель.
Я не говорю, что другие ответы неверны, просто вы задали немного неправильный вопрос.
Чтобы понять ответ, который я дал, вероятно, легче забыть о template
линии и вместо этого посмотрите на:
/* complex template-template gibberish */
void foo(container_tmpl<value_t> x) {
Тип x
параметр для foo
, имеет тип container_tmpl<value_t>
, куда container_tmpl
это что-то вроде vector
или же list
, а также value_t
это что-то вроде int
или же std::string
, Когда вы пишете эту подпись, становится очевидным, что value_t
просто тип (и, следовательно, становится typename value_t
во введении шаблона) и что container_tmpl
шаблон, принимающий (как минимум) один тип параметра
В данном контексте, value_t
а также container_tmpl
определяются внутри bar
,
Если вы не понимаете, почему у меня есть typename ...
тогда помни что vector
на самом деле принимает два типа аргументов, а не один. В любом случае, основная идея заключается в том, что вы должны предоставить имена для этих шаблонных аргументов вне того места, где вы ожидаете их получить. Например, если у вас есть шаблон, который принимает три аргумента, два параметра типа и целое число.
template< template<typename,int,typename> class the_template, typename T1, int I, typename T2>
void foo(the_template<T1,I,T2> x);
Нет. Это параметр шаблона для TP<>, а не внешняя функция шаблона.