template< class T > struct unused;
template<class RootT, template< class T> class T0>struct TrimUnused
{
typedef T0<typename TrimUnused< RootT, unused >::Result > Result;
};
template< class RootT >struct TrimUnused< RootT, unused >
{
typedef RootT Result;
};
template< class T > struct A : T{ void check(char* p){ *p = 'A'; T::check(++p); }};
struct Root{ void check(char* p){*p = 'R';} };
//! Класс-наследник
struct D : public TrimUnused< Root, A >::Result
{
typedef TrimUnused< Root, A >::Result _BaseT;
void check(char* p){ *p = 'D';_BaseT::check(++p); }
};
int main()
{
typedef TrimUnused< Root, A > T1;
cout<<typeid(T1::Result).name()<<endl;
char temp[32] = { 0 };
D d;
d.check(temp);
return 0;
}