Re: Как специализировать шаблон для иерархии?
От: Кодт Россия  
Дата: 04.03.13 13:50
Оценка: 6 (1)
Здравствуйте, 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> {};
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.