我正在阅读函数>模板>显式专业化中的入门C++ >冒险。
为了说明显式专业化认证的原因/用法,我们举例说明了一个案例。考虑一个交换模板函数,它可以交换任何类型(int、double、struct等)。(我认为代码很明显,所以不需要在这里写)
但是有一个特定的结构(称为job),您只想交换其中的两个成员,而让其余的成员保持原样。您将需要一个不同的定义,因此您必须进行明确的专业化认证。
在同一节中有这样一句话:“专门化覆盖常规模板,而非模板函数覆盖两者。”为什么不为这个用途创建一个(常规)函数呢?那么常规/非模板会覆盖模板吗?
如果我的解决方案是正确的,那么什么是显式专业化认证的好例子?
发布于 2011-06-20 12:47:53
显式专门化的用例之一是避免在实际的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
{}然后,该函数会由于参数不匹配而导致编译错误,并会提醒您相应的更改。
另一种用法或(不同之处)在于,显式专门化函数可以被包括在头文件中,而无需考虑多个符号链接错误。请注意,显式专门化也有自己的缺点,但我已经演示了它的一个好的方面。
发布于 2011-06-20 18:16:02
为什么不为这个用途创建一个(常规)函数呢?那么常规/非模板会覆盖模板吗?
当然,如果可以的话,您可以使用常规函数重载而不是显式函数模板专门化。但是,如果显式使用函数模板(通过指定模板参数),则不会使用常规函数重载。
示例:
您有函数模板:
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);在某个地方。
发布于 2011-06-20 18:35:27
标准函数可以是专门化的,但不能重载,仅举一个例子。另一个例子是类型是不可演绎的,并且你有现有的代码用显式的模板参数调用它们-那么你的重载就没有价值了。
https://stackoverflow.com/questions/6406833
复制相似问题