首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的显式专业化认证

C++中的显式专业化认证
EN

Stack Overflow用户
提问于 2011-06-20 12:33:46
回答 3查看 1.8K关注 0票数 2

我正在阅读函数>模板>显式专业化中的入门C++ >冒险。

为了说明显式专业化认证的原因/用法,我们举例说明了一个案例。考虑一个交换模板函数,它可以交换任何类型(int、double、struct等)。(我认为代码很明显,所以不需要在这里写)

但是有一个特定的结构(称为job),您只想交换其中的两个成员,而让其余的成员保持原样。您将需要一个不同的定义,因此您必须进行明确的专业化认证。

在同一节中有这样一句话:“专门化覆盖常规模板,而非模板函数覆盖两者。”为什么不为这个用途创建一个(常规)函数呢?那么常规/非模板会覆盖模板吗?

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

EN

回答 3

Stack Overflow用户

发布于 2011-06-20 12:47:53

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

代码语言:javascript
复制
template<typename T1, typename T2>
void foo(T1 o1, T2 o2)  // template function
{}
void foo(int o1, int o2) // regular function overloaded
{}

到现在为止,一切都很好。现在,在一段时间后,您必须更改template<> foo()的定义

代码语言:javascript
复制
template<typename T1, typename T2, typename T3> // new parameter added
void foo(T1 o1, T2 o2, T3 o3)  // template function
{}

您相应地更改了对foo()的所有调用,但是您使用未命中/混乱的来更改常规重载函数foo()。那么,这就是一场灾难!因为编译会进行得很好,常规调用会被静默地替换为template<> foo(),这是不受欢迎的。

现在,如果有明确的专门化,比如,

代码语言:javascript
复制
template<>
void foo(int o1, int o2) // explicit specialization
{}

然后,该函数会由于参数不匹配而导致编译错误,并会提醒您相应的更改。

另一种用法或(不同之处)在于,显式专门化函数可以被包括在头文件中,而无需考虑多个符号链接错误。请注意,显式专门化也有自己的缺点,但我已经演示了它的一个好的方面。

票数 4
EN

Stack Overflow用户

发布于 2011-06-20 18:16:02

为什么不为这个用途创建一个(常规)函数呢?那么常规/非模板会覆盖模板吗?

当然,如果可以的话,您可以使用常规函数重载而不是显式函数模板专门化。但是,如果显式使用函数模板(通过指定模板参数),则不会使用常规函数重载。

示例:

您有函数模板:

代码语言:javascript
复制
template< class T >
void foo( T& x, const T& y )
{
...
}

然后,如果指定函数重载:

代码语言:javascript
复制
void foo( double& x, const double& y )
{
....
}

在下面这样的代码中:

代码语言:javascript
复制
template< class T >
void some_function( T& x )
{
    T y;
    ......
    foo<T>( x, y );
}

函数重载void foo( double& x, const double& y )永远不会被使用。

但是如果您指定函数模板专门化

代码语言:javascript
复制
template<>
void foo<double>( double& x, const double& y )
{
....
}

some_function将使用您的专门化,如果您调用

代码语言:javascript
复制
double x;

some_function(x);

在某个地方。

票数 1
EN

Stack Overflow用户

发布于 2011-06-20 18:35:27

标准函数可以是专门化的,但不能重载,仅举一个例子。另一个例子是类型是不可演绎的,并且你有现有的代码用显式的模板参数调用它们-那么你的重载就没有价值了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6406833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档