Шаблон шаблона шаблона для функции

Является ли эта допустимая конструкция шаблона в шаблонах С++?

template < template <typename T2> class T> 
void foo() {

}

Ответ 1

Да. Это действительно.

Вы можете вызвать эту функцию с любым шаблоном класса, который принимает ровно один параметр шаблона. Например,

template<typename T> 
struct A
{
   //...
};

foo< A >(); //ok

Обратите внимание, что вам не нужно предоставлять аргумент шаблона для шаблона класса A, что означает, что следующее приведет к ошибке компиляции:

foo< A<int> >(); //error

Кроме того, в вашем коде T2 является необязательным, и на самом деле вы не можете использовать его в функции, поэтому лучше удалите его, чтобы упростить определение:

template < template <typename> class T> 
void foo() {

    T<int> x; //this is how T can be instantiated; provide template argument!
}

Демо: http://ideone.com/8jlI5