Здравствуйте, Basil2, Вы писали:
B>Есть ли более простой способ инстанцировать шаблон для всей иерархии?
Эскиз:
// рабочий шаблон
template<class T, class Root = void> struct TypeHolderImpl { ..... }; // основная ветвь
template<class T> struct TypeHolderImpl<T, MyIface> { ..... }; // ветвь для семейства MyIface
template<class T> struct TypeHolderImpl<T, YourIface> { ..... }; // ветвь для семейства YourIface
// селектор (можно сделать на mpl, но на перегрузке функций - проще)
void* typeholder_selector(void*);
MyIface* typeholder_selector(MyIface*);
YourIface* typeholder_selector(YourIface*);
// если тип унаследован от нескольких корней, то возникнет неоднозначность
// если YourIface унаследован от MyIface, то будет выбран он, как более точный
// метафункция селектора
template<class T> struct GetRootType : remove_pointer<decltype(typeholder_selector((T*)0))> {};
// шаблон-диспетчер
template<class T> struct TypeHolder : TypeHolderImpl<T, typename GetRootType<T>::type> {};