Reputation: 437
assume we have a class DefaultClass
which is a template class. We have many classes
that specialize traits spec_traits
, lets call them SpecClass1
itp. . SpecClass#
itself can be
a template with one parameter, like so SpecClass2<T>
. Is there an elegent way to implementDefaultClass
so DefaultClass<SpecClass1>
and DefaultClass<SpecClass<SomeType>, SomeType>
could be used. I use specialization:
// 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> {};
Is there a better way then using those _phony
types?
Upvotes: 1
Views: 167
Reputation: 96251
The simplest way seems to be for the spec types to provide a typedef for 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> > {};
Upvotes: 3