Выставьте самое прямое имя шаблона базового класса - PullRequest
0 голосов
/ 18 февраля 2020

Рассмотрим следующий код:

template <class...> struct base {};
template <class... T> struct intermediate: base<void, T...> {};
template <class... T> struct derived: base<T...>, intermediate<T...> {};

using type1 = derived<int>::intermediate::base; // works
using type2 = derived<int>::base; // ambiguous

Будет ли способ заставить его работать без двусмысленности, чтобы derived<int>::base означал самый "прямой" базовый класс в иерархии (в этом примере base<int>). Шаблон метапрограммирования приветствуется.

1 Ответ

0 голосов
/ 18 февраля 2020

При необходимости вы можете добавить псевдоним в derived, чтобы вы могли использовать их извне:

template <class... Ts> struct derived: base<Ts...>, intermediate<Ts...>
{
    using DirectBase = base<Ts...>;
    using IndirectBase = typename intermediate<Ts...>::base;
};

А затем

using type1 = derived<int>::IndirectBase ;
using type2 = derived<int>::DirectBase ;

Я не вижу способов устранения неоднозначности.

Было предложение по std::bases std::direct_bases, которое могло бы помочь, но было отклонено.

...