我将配置存储为类型:
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
具有相同的定义。
问题是:
将对CONFIG1
和CONFIG3
进行哪些专业化,或者:何时类型相同?是它的名称还是它&# 39;实际内容?
如果是实际内容,我怎样才能实现CONFIG1
和CONFIG3
实际调用不同的专业化?
答案 0 :(得分:3)
CONFIG1
和CONFIG3
属于同一类型,因此您的专业化将失败
error: redefinition of 'struct MyClass<Config<x, y, z> >'
struct MyClass<CONFIG3>{};
您可以使用继承来创建新类型:
using CONFIG1 = Config<x, y, z>;
struct CONFIG3 : CONFIG1{};
答案 1 :(得分:2)
CONFIG1和CONFIG3属于同一类型。如果您有疑问,可以使用std::is_same
答案 2 :(得分:1)
CONFIG1
和CONFIG2
是不同的模板实例,CONFIG1
和CONFIG3
不是(假设a
,b
,{{1} }与c
,x
,y
)不同。
- 将对
醇>z
和CONFIG1
进行哪种专业化,或者:何时类型相等?这是它的名字还是它的实际内容?
CONFIG3
和CONFIG1
是相同的类型。按CONFIG3
命名是无关紧要的。
- 如果是实际内容,我怎样才能实现
醇>typedef
和CONFIG1
实际调用不同的专业化?
你不能,CONFIG3
只提供别名而不是新类型。
使用(空)公开继承的类来实际创建新类型。