C++部分模板特化语法

ura*_*ray 3 c++ templates metaprogramming partial-specialization specialization

对于主要模板:

template<typename A, typename B> class MyClass {...
Run Code Online (Sandbox Code Playgroud)

与模板专业化,有什么区别

template<typename A, typename B> class MyClass<int, float> {...
Run Code Online (Sandbox Code Playgroud)

template<> class MyClass<int, float> {...
Run Code Online (Sandbox Code Playgroud)

Vla*_*lad 6

template<typename A, typename B> class MyClass<int, float> {...不应该被允许.事实上,如果指定的形参AB,你的模板应使用它们.

第二种情况是正常的:你说你没有"免费"参数进行专业化.

一个中间案例可能是

template<typename A> class MyClass<A, float> {...
Run Code Online (Sandbox Code Playgroud)

这又是有效的:这里你只修复第二个模板参数.

部分特化的想法如下:使用一些形式参数创建模板,并使用它们来表达对初始模板参数的约束.部分特化的参数不需要与初始模板参数相同.例:

template<typename X, typename Y, typename Z> class MyClass<X*, Y(Z&)> {...
Run Code Online (Sandbox Code Playgroud)

对你的案子来说是一个有效的部分专业化.这可以理解为"为任意类型X,Y并且Z,如果MyClass的模板参数匹配X*Y(Z&)使用这种专业化".编译器应该非常聪明才能匹配类型模式.