基于 SFINAE 的跨命名空间的运算符重载
SFINAE-based Operator Overloading across Namespaces
我正在尝试使用一种允许为强类型枚举类自动启用位掩码运算符的方法。请参阅下面的示例的标题和 cpp。
https://www.justsoftwaresolutions.co.uk/files/bitmask_operators.hpphttps://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++中是否可以使用所需的方法?
ADL 找不到您的函数,您可以添加一些using
以允许使用它:
using ONE::operator|;
TWO::A a1 = TWO::A::x | TWO::A::y;
演示
using namespace ONE;
也可能是一种选择。
相关文章:
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- C++20概念:需要运算符重载
- 使用赋值运算符重载从类中返回jobject
- 在运算符重载定义中使用成员函数(const错误)
- 字节到位运算符重载C++
- 为什么在运算符重载时需要参考?
- 类中 c++ 的运算符 + 重载
- 算术复合运算符重载为非成员
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 交换运算符 + 重载会导致无限递归
- 如何理解新的运算符重载?
- 向量保持复数的运算符重载
- 如何创建运算符重载?
- 链接列表运算符重载没有打印出我想要的内容
- C++:需要帮助了解运算符重载错误
- 使用模板化运算符重载 XOR 运算符失败
- 如何确保接受的C++模板类型使运算符重载?
- 运算符重载使用运算符+添加类模板