模板模板参数或模板参数

时间:2012-12-27 17:25:33

标签: c++ templates parameters specialization

假设我们有一个类DefaultClass,它是一个模板类。我们有很多课程 专门化特征spec_traits,让我们称之为SpecClass1 itp。 。 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 个答案:

答案 0 :(得分:3)

最简单的方法似乎是规范类型为SomeType提供typedef:

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> > {};