使用宏声明运算符
Declaring operators using macros
#define DECLARE_GLOBAL_OPERATOR(OPERATOR)
X OPERATOR(const X &, const X &);
struct X {};
DECLARE_GLOBAL_OPERATOR(operator+);
上面的代码声明了一个全局加法运算符,正如人们直观地期望的那样,但宏只接受运算符符号的简单变体在 Clang 3.5.0 和 ideone 上不起作用(使用 C++11 进行测试)。
#define DECLARE_GLOBAL_OPERATOR(SYMBOL)
X operator##SYMBOL(const X &, const X &);
struct X {};
DECLARE_GLOBAL_OPERATOR(+);
在这里,Clang抱怨说pasting formed 'operator+', an invalid preprocessing token
,而ideone输出pasting "operator" and "+" does not give a valid preprocessing token
。此代码格式不正确吗?
请注意,下面的代码编译和执行良好,因此问题似乎与将+
、-
、x
或/
参数传递给宏无关。
#define WHATEVER(SYMBOL)
int value = 2 SYMBOL 4;
说它声明全局运算符比实际定义它更准确。 关键字为 operator
,运算符符号是单独的标记。 而且您只能将标识符粘贴在一起,而不能粘贴标识符和运算符符号。
因此,您可以通过删除##
来使第二个版本正常工作:
#define DEFINE_GLOBAL_OPERATOR(SYMBOL)
X operator SYMBOL(const X &, const X &);
struct X {};
DEFINE_GLOBAL_OPERATOR(+);
相关文章:
- 在哪里声明结构运算符重载
- 让某个类的 '=' 运算符在声明时运行构造函数
- 为什么我在声明对象数组时不能使用 -> 运算符?
- 在一个指令中声明更多指针的运算符优先级
- 类模板中文本运算符的友元声明
- 新运算符分配的大小大于声明的大小.为什么
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?
- 为什么我不能定义一元运算符,然后在 MSVC 的模板类中声明具有相同名称的友元二进制运算符?
- 为什么重载运算符>在参数声明 const 时不起作用?
- Ho 在标头中声明是结构中的重载运算符?
- 是否可以将引用类型别名与指针运算符一起使用来声明对指针的引用?
- 二元运算符声明的'static'关键字
- 将默认赋值运算符声明为 constexpr:哪个编译器是正确的?
- 如何将 decltype 应用于运算符 [] 声明中的成员函数
- C++重载赋值运算符声明中做什么?
- 如何阅读此运算符声明和实现
- 如何将 lambda 的运算符 () 声明为 noreturn?
- 错误:"运算符"声明为非函数
- 错误:将"运算符<<"声明为非函数|
- 将"运算符<<声明为非函数