c++ - 模板模板参数或模板参数

标签 c++ templates parameters specialization

假设我们有一个类 DefaultClass这是一个模板类。我们有很多类(class) 专注于特质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类型?

最佳答案

最简单的方法似乎是规范类型为 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> > {};

关于c++ - 模板模板参数或模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14058643/

相关文章:

javascript - For 循环不使用 JavaScript 函数的参数

java - 更改 "File"参数的值而不创建类的新实例

c++ - 将数字隐式转换为整型常量

C++ - 连续检查 3

c++ - 无法使用 CPU 后端的 tensorflow AOT 编译创建最终二进制文件

android - 适用于 Android 的简单 FFMpeg 播放器

c++ - C++ 中的模板 vector

c++ - 公共(public) "using"= decltype(<private>)

parameters - 在 lisp 中按值传递参数

c++ - 在 Eclipse Oxygen 中通过 Ctrl+click 的超链接导航不起作用