C++ 中何时需要或需要“显式专业化”?

waj*_*jed 6 c++ templates overloading template-specialization language-lawyer

我正在阅读

C++ 入门 > 函数冒险 > 模板 > 显式专业化。

为了说明显式专业化的原因/用途,举例说明了一个案例:

考虑一个可以交换任何类型(int, double, struct等等...)的交换模板函数

但有一个特定的struct job情况,您只想交换其中的两个成员,并保留其余成员不变。您将需要不同的定义,因此您必须进行显式专业化。

在同一节中有这样的声明:-

“专业化覆盖常规模板,非模板函数覆盖两者。”

为什么不直接为该用途创建一个常规函数呢?那么常规/非模板将覆盖模板,不是吗?

如果我的解决方案是正确的,那么显式专业化的一个很好的例子是什么?

iam*_*ind 10

显式专业化的用例之一是避免在实际函数中发生某些更改时跳过常规函数template。要理解请参阅下面的示例:

template<typename T1, typename T2>
void foo(T1 o1, T2 o2)  // template function
{}
void foo(int o1, int o2) // regular function overloaded
{}
Run Code Online (Sandbox Code Playgroud)

到现在为止还好。现在过了一段时间你必须改变的定义template<> foo()

template<typename T1, typename T2, typename T3> // new parameter added
void foo(T1 o1, T2 o2, T3 o3)  // template function
{}
Run Code Online (Sandbox Code Playgroud)

您相应地更改了所有调用foo(),但是您错过/弄乱了更改常规重载函数foo()。那么,那就是灾难了!因为编译会顺利进行,并且常规调用会默默地被替换template<> foo(),这是不希望的。

现在,是否有明确的专业化,例如,

template<>
void foo(int o1, int o2) // explicit specialization
{}
Run Code Online (Sandbox Code Playgroud)

那么该函数会因为参数不匹配而给你编译错误,并提醒你相应的更改。

另一个用法或(区别)是可以将显式专用函数包含在头文件中,而无需担心多个符号链接错误。请注意,显式专业化也有其自身的缺点,但我演示了它好的一面。