我正在阅读Primer C ++> “功能中的冒险”>模板>明确的专业化。
为了显示Explicit Specialization的原因/用途,说明了一个案例。 考虑一个可以交换任何类型(int,double,struct等)的交换模板函数(我认为 代码很明显所以不需要在这里写出来)
但是有一个特定的结构(称为作业),您只想交换两个成员,并保留其余成员。您将需要一个不同的定义,因此您必须进行显式专业化。
同一部分有此声明: - “专门化会覆盖常规模板,并且非模板函数会覆盖 都。” 为什么不为这个用途制作一个(常规)函数?那么常规/非模板会覆盖模板吗?
如果我的解决方案是正确的,那么明确专业化的一个好例子是什么?
答案 0 :(得分:3)
显式特化的一个用例是避免在实际template
函数中发生某些更改时跳过常规函数。要理解,请参见下面的示例:
template<typename T1, typename T2>
void foo(T1 o1, T2 o2) // template function
{}
void foo(int o1, int o2) // regular function overloaded
{}
直到现在没关系。现在有一段时间后你必须改变template<> foo()
template<typename T1, typename T2, typename T3> // new parameter added
void foo(T1 o1, T2 o2, T3 o3) // template function
{}
您已相应地将所有来电更改为foo()
,但错过/搞砸了以更改常规重载功能foo()
。然后,这是灾难!因为编译会很好,并且常规调用会被template<> foo()
静默替换,这是不受欢迎的。
现在,如果有明确的专业化,例如,
template<>
void foo(int o1, int o2) // explicit specialization
{}
然后该函数会因不匹配的参数而给你编译错误,这会提醒你相应的更改。
其他用法或(差异)是明确专用的函数可以包含在头文件中,而不必担心多个符号链接错误。 请注意,显式专业化也有自己的drabacks,但我有一个好的方面。
答案 1 :(得分:0)
为什么不做一个(常规)功能 那个用途?然后一个 常规/非模板将覆盖 模板?
当然,如果可以,你可以使用常规函数重载而不是显式函数模板特化。但是,如果明确使用函数模板(通过指定模板参数),则不会使用常规函数重载。
示例:强>
你有功能模板:
template< class T >
void foo( T& x, const T& y )
{
...
}
然后,如果指定函数重载:
void foo( double& x, const double& y )
{
....
}
在这样的代码中:
template< class T >
void some_function( T& x )
{
T y;
......
foo<T>( x, y );
}
永远不会使用函数重载void foo( double& x, const double& y )
。
但是如果你指定功能模板专业化
template<>
void foo<double>( double& x, const double& y )
{
....
}
如果您致电
,some_function
会使用您的专业化
double x;
some_function(x);
的某个地方。
答案 2 :(得分:0)
标准函数可以是专用的,但可能不会过载,仅用于一个示例。另一个例子是类型是不可导出的,你有现有的代码用显式模板参数调用它们 - 你的重载就没那么值了。