类 Widget 有一些函数适用于所有参数类型(常用函数)和其他需要为给定类型专门化的函数(不常用函数)。
g++ 坚持认为 Widget 的特化也应该定义 common_fn() 而不仅仅是 uncommon_fn(),但这首先违背了使用特化的目的。如何避免重复 common_fn()?
#include <cassert>
template<typename Type> struct Widget
{
Widget() {}
char common_fn() { return 'a'; }
int uncommon_fn() { return 1; }
};
template<> struct Widget<char>
{
Widget() {}
int uncommon_fn() { return 2; }
};
int main()
{
Widget<char> WidgetChar;
assert( WidgetChar.common_fn() == 'a' ); // Error
assert( WidgetChar.uncommon_fn() == 2 );
}
开始编辑
对阿尔夫:
我无法使用
template<> int Widget<char>::uncommon_fn() { return 2; }
因为一些不常见的函数需要返回一个特征类型(因此通过使实际类型为原始类型来简化是过度的)。
或者实际上有一种方法可以让编译器typename Foo::Bar
在编写时识别
struct Foo { typedef FooBar Bar; };
template<> typename Foo::Bar Widget<Foo>::uncommon_fn() { return ....; }
?
结束编辑
开始编辑2
致艾米林德:
这很有趣,但出于同样的原因,我无法使用来自 Widget 的派生(或者可能更清晰的将公共部分重构为父类 GeneralWidget 的解决方案)。共同的部分并不完全共同。它们的声明和定义看起来相同,但因为它们使用了特征,所以它们最终完全不同。
结束编辑2