Это может сработать для вас (если я правильно понял вопрос). Я работал с gcc, но думаю, что он должен работать даже в VS2010.
void printTypeComponents(const Blank&)
{
std::cout << "composed of Blank\n";
}
template <typename T>
void printTypeComponents(const A<T>&)
{
std::cout << "composed of A\n";
printTypeComponents(T());
}
template <typename T>
void printTypeComponents(const B<T>&)
{
std::cout << "composed of B\n";
printTypeComponents(T());
}
template <typename T>
void printTypeComponents(const C<T>&)
{
std::cout << "composed of C\n";
printTypeComponents(T());
}
Преимущество состоит в том, что вам не нужны никакие typedef
внутри классов. Если вы хотите, вы можете поместить логику в printTypeComponentsImpl
(или что-то в этом роде), и printTypeComponents
делегировать эту функцию.
Вы можете избежать создания временных объектов, но, поскольку вы не можете частично специализировать функции, вам придется перемещать все внутри структуры и использовать это. Если хотите, я могу привести пример кода здесь.
edit: Вы могли бы немного автоматизировать его с помощью typeid(x).name()
, при условии, что вы можете извлечь из него имя шаблона класса (здесь он называется getTemplateName
).
template <template <typename> class T, typename U>
void printTypeComponents(const T<U>&)
{
std::cout
<< "composed of "
<< getTemplateName(typeid(T<DummyClass>).name())
<< '\n';
printTypeComponents(U());
}
Для тех, кто заинтересован, здесь конкретный пример gcc.