假设我们有一个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类型更好的方法?
发布于 2012-12-28 01:49:48
最简单的方法似乎是让规范类型为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> > {};https://stackoverflow.com/questions/14058643
复制相似问题