Использование имен аргументов параметров шаблона шаблона

В коде

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<>, а не внешняя функция шаблона.

Другие вопросы по тегам