为运算符定义别名

问题描述 投票:0回答:2

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

我想用例如“Vertical Four Dots”U+205E

cout 
⁞ endl ⁞ "filename:      " ⁞ cfgfilename
⁞ endl ⁞ "message:       " ⁞ e.what() 
⁞ endl ⁞ "exception id:  " ⁞ e.id
⁞ endl ⁞ "byte position: " ⁞ e.byte ;   

而不是这个:

cout 
<< endl << "filename:      " << cfgfilename
<< endl << "message:       " << e.what() 
<< endl << "exception id:  " << e.id
<< endl << "byte position: " << e.byte ;   

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

c++ syntax operators
2个回答
4
投票

C ++只允许运算符重载,而不是新定义。所以你可以重新定义<<的作用,但是你不能像那样定义一个新的运算符。

它当然被认为是语言的演变,而Bjarne Stroustrup本人(编写C ++的人)有explained why他们决定不允许它:

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

抱歉,没有。这种可能性已被多次考虑过,但每次我/我们都认为可能出现的问题超过了可能带来的好处。这不是语言技术问题。即使我在1983年首次考虑它,我也知道它是如何实现的。然而,我的经验是,当我们超越最微不足道的例子时,人们似乎对运营商使用的“明显”含义有着微妙的不同看法。一个经典的例子是** b ** c。假设**已经被认为是指取幂。现在应该a ** b ** c是指(a ** b)** c还是**(b ** c)?我认为答案很明显,我的朋友们同意了 - 然后我们发现我们不同意哪个决议是明显的。我的猜想是,这些问题会导致细微的错误。

您可以做的最好的事情是添加一个构建步骤,在将编译单元传递给编译器之前用替换<<。根据您的构建环境,使用make文件或同等文件可能相当简单。

致谢:我从this answer那里得到了很多灵感。


0
投票

有一个list可用的运算符可用于运算符重载。因此,您无法为自定义字符创建运算符作为自定义字符重载运算符。

除此之外,C++ standard定义了可用于编写程序的字符集。 unicode字符在C ++源文件中无效,作为运算符重载的名称。

© www.soinside.com 2019 - 2024. All rights reserved.