Искомое решение для функции выглядит так:
template<class T> class TestTemplate;
class TestClass;
template<class T> void Foo(){ std::cout << "class\n"; }
template<template<class> class T> void Foo(){std::cout << "template<class>\n";
...
Foo<TestTemplate>();
Foo<TestClass>();
Задача в том, чтобы таким же образом специализировать шаблон класса, грубо говоря:
template<class T> class TestTemplate;
class TestClass;
template<class T> class Bar { static void print(){std::cout << "class\n";} };
template<template <class> class T> class Bar { static void print(){std::cout << "template<class>\n";} };
...
Bar<TestTemplate>::print();
Bar<TestClass>::print();
Не выходит каменный цветок.