The_Ham
The_Ham

Reputation: 437

template template parameter or template parameter

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

Answers (1)

Mark B
Mark B

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

Related Questions