如何在下面的代码中的所有特化项(对于Widget<A<T> >
和Widget<B<T> >
,无论是什么T)中共享common_fn()?
#include <cassert>
struct Afoo {};
struct Bfoo {};
template<typename T> struct A { typedef Afoo Foo; };
template<typename T> struct B { typedef Bfoo Foo; };
template<typename Type> struct Widget
{
Widget() {}
typename Type::Foo common_fn() { return Type::Foo(); }
int uncommon_fn() { return 1; }
};
template<typename T> struct Widget<A<T> >
{
Widget() {}
int uncommon_fn() { return 2; }
};
int main()
{
Widget<A<char> > WidgetAChar;
assert( WidgetAChar.common_fn() == Afoo() ); // Error
assert( WidgetAChar.uncommon_fn() == 2 );
}
我曾尝试earlier将问题简化为我认为的本质,但事实证明有必要在部分专业化和特征的背景下提出问题。