Перегрузка операторов на основе SFINAE в пространствах имен - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь использовать подход, который позволяет автоматически включать операторы битовой маски для строго типизированных классов enum. Смотрите ниже заголовок и cpp примера.

https://www.justsoftwaresolutions.co.uk/files/bitmask_operators.hpp https://www.justsoftwaresolutions.co.uk/files/testbitmask.cpp

Подход в testbitmask.cpp работает, когда все находится в одном и том же пространстве имен, однако я хотел бы отделить код SFINAE в другом пространстве имен от использования другими классами (см. Ниже или https://wandbox.org/permlink/05xXaViZT3MVyiBl).

#include <type_traits>

namespace ONE {
    template<typename E>
    struct enable_bitmask_operators{
        static const bool enable=false;
    };

    template<typename E>
    inline typename std::enable_if<enable_bitmask_operators<E>::enable,E>::type
    operator|(E lhs,E rhs){
        typedef typename std::underlying_type<E>::type underlying;
        return static_cast<E>(
            static_cast<underlying>(lhs) | static_cast<underlying>(rhs));
    }
}

namespace TWO {
    enum class A{ x=1, y=2};
}

namespace ONE {
    template<>
    struct enable_bitmask_operators<TWO::A>{
        static const bool enable=true;
    };
}

int main(){
    TWO::A a1 = TWO::A::x | TWO::A::y;
}

Это приводит к невозможности найти перегруженный оператор в main. Явный вызов функции работает (TWO::A a1 = ONE::operator|(TWO::A::x , TWO::A::y);), но, конечно, это не желаемая функциональность.

Если мы переместим специализацию в namespace ONE, компилятор выдаст error: declaration of 'struct ONE::enable_bitmask_operators<TWO::A>' in namespace 'TWO' which does not enclose 'ONE'. Мне интересно, возможен ли желаемый подход в C ++?

1 Ответ

0 голосов
/ 24 января 2019

Ваша функция не может быть найдена ADL, вы можете добавить немного using, чтобы разрешить ее использование:

using ONE::operator|;
TWO::A a1 = TWO::A::x | TWO::A::y;

Демо

using namespace ONE; тоже может быть альтернативой.

...