Немного неясно, к чему вы стремитесь, в частности, действительно ли uncommon_fn
так же просто, как показано, или может быть больше.
Но в любом случае, для приведенного примера кода рассмотрим & hellip;
#include <cassert>
#include <typeinfo>
struct Afoo {};
struct Bfoo {};
template< class T > struct A { typedef Afoo Foo; };
template< class T > struct B { typedef Bfoo Foo; };
template< class Type >
struct UncommonResult { enum { value = 1 }; };
template< class Type >
struct UncommonResult< A< Type > > { enum { value = 2 }; };
template< class Type >
struct Widget
{
Widget() {}
typename Type::Foo common_fn() { return Type::Foo(); }
int uncommon_fn() { return UncommonResult< Type >::value; }
};
int main()
{
Widget<A<char> > WidgetAChar;
assert( typeid( WidgetAChar.common_fn() ) == typeid( Afoo ) ); // OK
assert( WidgetAChar.uncommon_fn() == 2 );
}
Обобщение этого для обработки более общего uncommon_fn
не должно быть сложным.
Вы также можете рассмотреть уловку наследования, которую @iammilind показал для вашего предыдущего вопроса. Это может быть практически проще. Однако это добавляет возможность доступа к возможно «неправильной» реализации функции.
Приветствия и hth.