В вашем случае, единственный способ, который я вижу, это явно специализировать MyClass
для InheritSomeTag
. Однако в документе SeqAn предлагается механизм, называемый «подклассом шаблонов», который делает то, что вы хотите - хотя и с другим синтаксисом наследования, поэтому код не совместим с вашей текущей функцией main
.
// Base class
template <typename TSpec = void>
class SomeTag { };
// Type tag, NOT part of the inheritance chain
template <typename TSpec = void>
struct InheritSomeTag { };
// Derived class, uses type tag
template <typename TSpec>
class SomeTag<InheritSomeTag<TSpec> > : public SomeTag<void> { };
template <class T, class Tag=T>
struct MyClass { };
template <class T, typename TSpec>
struct MyClass<T, SomeTag<TSpec> >
{
typedef int isSpecialized;
};
int main()
{
MyClass<SomeTag<> >::isSpecialized test1; //ok
MyClass<SomeTag<InheritSomeTag<> > >::isSpecialized test2; //ok
}
Это, конечно, выглядит странно и очень громоздко, но допускает механизм истинного наследования с полиморфными функциями, который выполняется во время компиляции. Если вы хотите увидеть это в действии, взгляните на некоторые примеры SeqAn .
При этом я считаю, что SeqAn является особым случаем, и не многие приложения извлекут выгоду из этого чрезвычайно сложного синтаксиса (расшифровка ошибок, связанных с SeqAn, является настоящей болью в * ss!)