何时类型相等(模板专业化)?

时间:2015-05-31 14:09:57

标签: c++ templates typedef using

我将配置存储为类型:

using CONFIG1 = Config<x, y, z>;
using CONFIG2 = Config<a, b, c>;
using CONFIG3 = Config<x, y, z>;

对于每个配置,都有一个类模板专门化,它可以进行更多的配置工作:

template <class CONFIG>
MyClass;

template <>
MyClass<CONFIG1>{...}

template <>
MyClass<CONFIG2>{...}

template <>
MyClass<CONFIG3>{...}

现在,正如您所见,CONFIG1恰好与CONFIG3具有相同的定义。

问题是:

  1. 将对CONFIG1CONFIG3进行哪些专业化,或者:何时类型相同?是它的名称还是它&# 39;实际内容?

  2. 如果是实际内容,我怎样才能实现CONFIG1CONFIG3实际调用不同的专业化?

3 个答案:

答案 0 :(得分:3)

CONFIG1CONFIG3属于同一类型,因此您的专业化将失败

error: redefinition of 'struct MyClass<Config<x, y, z> >'
struct MyClass<CONFIG3>{};

您可以使用继承来创建新类型:

using CONFIG1 = Config<x, y, z>;
struct CONFIG3 : CONFIG1{}; 

实例:https://ideone.com/4GrlaW

答案 1 :(得分:2)

CONFIG1和CONFIG3属于同一类型。如果您有疑问,可以使用std::is_same

进行验证

答案 2 :(得分:1)

CONFIG1CONFIG2是不同的模板实例,CONFIG1CONFIG3不是(假设ab,{{1} }与cxy)不同。

  
      
  1. 将对zCONFIG1进行哪种专业化,或者:何时类型相等?这是它的名字还是它的实际内容?
  2.   

CONFIG3CONFIG1是相同的类型。按CONFIG3命名是无关紧要的。

  
      
  1. 如果是实际内容,我怎样才能实现typedefCONFIG1实际调用不同的专业化?
  2.   

你不能,CONFIG3只提供别名而不是新类型。

使用(空)公开继承的类来实际创建新类型。