параметр шаблона шаблона или параметр шаблона

предположим, у нас есть класс DefaultClass который является шаблоном класса. У нас много классов
которые специализируются черты spec_traitsПозвоним им SpecClass1 и.т.п. , SpecClass# сам может быть
шаблон с одним параметром, вот так SpecClass2<T>, Есть ли лучший способ реализоватьDefaultClass так DefaultClass<SpecClass1> а также DefaultClass<SpecClass<SomeType>, SomeType> может быть использован. Я использую специализацию:

// DefaultClass.hpp
template<typename T>
class _phonyTemplate;
class _phonyType;
class _phonyNonTemplate;

template <template <class> class TemplateT, class TypeT, class NonTemplateT>
class DefaultClass;

// for DefaultClass<SpecClass<SomeType>, SomeType>
template <template <class> class TemplateT, class TypeT>
class DefaultClass<TemplateT, TypeT, _phonyNonTemplate>
{
// use SpecClass# traits
typedef spec_traits<TemplateT<TypeT> >::some_type used_type;
};// for DefaultClass<SpecClass1>
template <class NonTemplateT>
class DefaultClass<_phonyTemplate, _phonyType, NonTemplateT>
{
// use SpecClass# traits
typedef spec_traits<NonTemplateT>::some_type used_type;
};// SpecClass1.hpp
class SpecClass1 : public DefaultType<_phonyTemplate,
_phonyType, SpecClass1> {};

// SpecClass2.hpp
template <typename TypeT>
class SpecClass2 : public DefaultType<SpecClass2,
TypeT, _phonyNonTemplateT> {};

Есть ли лучший способ, чем использовать те, _phony типы?

1

Решение

Кажется, что простейшим способом для типов спецификаций является предоставление typedef для SomeType:

template <typename T>
class DefaultClass
{
typedef typename T::SomeType SomeType;
};

// SpecClass1.hpp
class SpecClass1 : public DefaultType<SpecClass1> {};

// SpecClass2.hpp
template <typename TypeT>
class SpecClass2 : public DefaultType<SpecClass2<TypeT> > {};
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]