类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; }
因为一些不常见的函数需要返回一个trait类型(因此通过使实际的类型原语来简化是太过分了).
或者实际上是一种使编译器在写入时识别typename Foo :: Bar的方法
struct Foo { typedef FooBar Bar; }; template<> typename Foo::Bar Widget<Foo>::uncommon_fn() { return ....; }
?
最终编辑
开始,EDIT2
到iammilind:
这很有趣,但是由于同样的原因,我无法使用Widget的派生(或者可能更清楚的将公共部分重构为父类GeneralWidget的解决方案).共同的部分并不完全普遍.他们的声明和定义看起来是一样的,但由于他们使用特质,他们的结局是完全不同的.
最终EDIT2
解决方法
#include <assert.h> template<typename Type> struct Widget { Widget() {} char common_fn() { return 'a'; } int uncommon_fn() { return 1; } }; template<> int Widget<char>::uncommon_fn() { return 2; } int main() { Widget<char> WidgetChar; assert( WidgetChar.common_fn() == 'a' ); // OK assert( WidgetChar.uncommon_fn() == 2 ); }