Ввести шаблонный оператор преобразования базового класса в производную область видимости - PullRequest
0 голосов
/ 23 мая 2018

У меня есть базовый класс, который определяет ограниченный шаблонный оператор преобразования

struct base {
    template <typename C, std::enable_if_t<some_constraints<C>, int> = 0>
    operator C() const;
};

У меня также есть производный класс, который реализует другой оператор преобразования с другими ограничениями:

struct derived : base {
    template <typename P, std::enable_if_t<different_constraints<P>, int> = 0>
    operator P() const;
};

К сожалению,объявление в производном классе скрывает оператор в базовом классе.Я хотел бы перенести базовый оператор в производную область, но «очевидный» синтаксис

template <typename C>
using base::operator C;

не работает (кажется, что компилятор пытается проанализировать его как объявление шаблона псевдонима).

Кто-нибудь знает правильный синтаксис для достижения этой цели?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Следующий трюк требует GNU g ++ с C ++ 14.

Если some_constraints и different_constraints являются взаимоисключающими, вы можете добавить using base::operator auto; в derived класс, чтобы сделать все операторы преобразованияиз base доступно.

Пример:

struct Base {
protected:
    // conversion to pointer types (protected).
    template<typename T, typename= typename std::enable_if<std::is_pointer<T>::value>::type>
    operator T() const;
};

struct Derived : public Base{
    // Make all Base conversion operators public.
    using Base::operator auto;

    // conversion to default constructible & non-pointer types.
    // added an extra typename=void to distinguish from Base template operator.
    template<typename T, typename= typename std::enable_if<!std::is_pointer<T>::value>::type,typename=void>
    operator T() const;
};

Демонстрационная версия

0 голосов
/ 24 мая 2018

Я бы сказал, что это невозможно.и даже если бы это было так, ваш производный оператор скрыл бы базовую единицу, так как аргумент шаблона не является частью согласно namespace.udecl # 15.sentence-1 :

Когда используетсяобъявитель переносит объявления из базового класса в производный класс, функции-члены и шаблоны функций-членов в производном классе переопределяют и / или скрывают функции-члены и шаблоны функций-членов с одинаковыми именами, параметром-список типов, cv-qualification и ref-квалификатор (если есть) в базовом классе (а не конфликтующий)

К сожалению, параметр шаблона не учитывается, и оба преобразования operator имеют пустой список параметров-типов, равны constи без реф-классификатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...