C ++中的显式专业化

时间:2011-06-20 04:33:46

标签: c++ templates template-specialization

我正在阅读Primer C ++> “功能中的冒险”>模板>明确的专业化。

为了显示Explicit Specialization的原因/用途,说明了一个案例。 考虑一个可以交换任何类型(int,double,struct等)的交换模板函数(我认为 代码很明显所以不需要在这里写出来)

但是有一个特定的结构(称为作业),您只想交换两个成员,并保留其余成员。您将需要一个不同的定义,因此您必须进行显式专业化。

同一部分有此声明: - “专门化会覆盖常规模板,并且非模板函数会覆盖 都。” 为什么不为这个用途制作一个(常规)函数?那么常规/非模板会覆盖模板吗?

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

3 个答案:

答案 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)

标准函数可以是专用的,但可能不会过载,仅用于一个示例。另一个例子是类型是不可导出的,你有现有的代码用显式模板参数调用它们 - 你的重载就没那么值了。