2015-05-31 29 views
1

我存储的配置作为类型:什么时候是一个类型相等(模板专业化)?

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,或:当是一种平等的吗?是它的名字还是它的实际内容?

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

+3

我期望这段代码不能编译,正是因为'CONFIG1'与'CONFIG3'相同。编译器可能会抱怨你不能为同一类型专门化两次。您不应该能够首先定义两个不同的专业化,更不用说调用它们了。 –

+0

我也期待这种行为,但它不回答这个问题。 – Michael

+1

它真的不能回答你的问题,还是只是不告诉你你想听到什么? 'CONFIG1'和'CONFIG3'是同一类型的两个名称 - 是不是你要求的?如果你想要不同的专业化,你将不得不使他们不同的类型,而不是相同类型的typedef。例如。你可以让他们从'Config '派生类。 –

回答

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

2

CONFIG1和CONFIG3是相同的类型。如果你怀疑,你可以验证与std::is_same

1

CONFIG1CONFIG2是不同的模板实例,CONFIG1CONFIG3不(应该abc来自xyz所有不同)。

  1. 哪个专业化将采取为CONFIG1CONFIG3,或:当是一种类型等于?它是名字还是实际内容?

CONFIG1CONFIG3相等的类型。命名typedef是无关紧要的。

  • 如果它的实际内容,我怎么能做到这一点CONFIG1CONFIG3实际调用不同专业?
  • 你不能,typedef只是提供别名没有真正的新类型。

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

    +0

    @IgorTandetnik稍微改写了我的答案。 –