定义操作符的别名

Mik*_*l V 0 c++ syntax operators

在 C++ 中,我可以通过typedef语句定义现有类型的别名。但是可以为操作员创建别名吗?具体来说,我想选择一些 Unicode 符号并为<<操作符创建一个别名。

我想使用例如“垂直四点” U+205E

cout 
? endl ? "filename:      " ? cfgfilename
? endl ? "message:       " ? e.what() 
? endl ? "exception id:  " ? e.id
? endl ? "byte position: " ? e.byte ;   
Run Code Online (Sandbox Code Playgroud)

取而代之的是:

cout 
<< endl << "filename:      " << cfgfilename
<< endl << "message:       " << e.what() 
<< endl << "exception id:  " << e.id
<< endl << "byte position: " << e.byte ;   
Run Code Online (Sandbox Code Playgroud)

如果不能使用四点字符,但使用其他一些符号,它也可以是一个选项(尽管比基本 ASCII 有更多选项会更好)。

Hea*_*ery 5

C++ 只允许运算符被重载,而不是新定义的。所以你可以重新定义做什么<<,但你不能定义像?.

在语言的演变过程中肯定已经考虑过它,并且 Bjarne Stroustrup 本人(编写 C++ 的人)解释了为什么他们决定不允许它:

我可以定义自己的运算符吗?

抱歉,没有。这种可能性已经考虑过多次,但每次我/我们都认为可能的问题超过了可能的好处。这不是语言技术问题。甚至当我在 1983 年第一次考虑它时,我就知道它可以如何实施。然而,我的经验是,当我们超越最琐碎的例子时,人们似乎对运算符用法的“明显”含义有着微妙的不同意见。一个经典的例子是 a**b**c。假设 ** 已表示取幂。现在应该 a**b**c 表示 (a**b)**c 还是 a**(b**c)?我认为答案是显而易见的,我的朋友们也同意了——然后我们发现我们在哪个决议是显而易见的问题上没有达成一致。我的猜测是这些问题会导致微妙的错误。

最好你大概可以做的是增加一个构建步骤替换?<<编译单元传递给编译器前。根据您的构建环境,这对于make文件或等效文件可能相当简单。

致谢:我从这个答案中得到了很多启发。