在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 ++只允许运算符重载,而不是新定义。所以你可以重新定义<<
的作用,但是你不能像⁞
那样定义一个新的运算符。
它当然被认为是语言的演变,而Bjarne Stroustrup本人(编写C ++的人)有explained why他们决定不允许它:
我可以定义自己的运算符吗?
抱歉,没有。这种可能性已被多次考虑过,但每次我/我们都认为可能出现的问题超过了可能带来的好处。这不是语言技术问题。即使我在1983年首次考虑它,我也知道它是如何实现的。然而,我的经验是,当我们超越最微不足道的例子时,人们似乎对运营商使用的“明显”含义有着微妙的不同看法。一个经典的例子是** b ** c。假设**已经被认为是指取幂。现在应该a ** b ** c是指(a ** b)** c还是**(b ** c)?我认为答案很明显,我的朋友们同意了 - 然后我们发现我们不同意哪个决议是明显的。我的猜想是,这些问题会导致细微的错误。
您可以做的最好的事情是添加一个构建步骤,在将编译单元传递给编译器之前用⁞
替换<<
。根据您的构建环境,使用make
文件或同等文件可能相当简单。
致谢:我从this answer那里得到了很多灵感。
有一个list可用的运算符可用于运算符重载。因此,您无法为自定义字符创建运算符作为自定义字符重载运算符。
除此之外,C++ standard定义了可用于编写程序的字符集。 unicode字符在C ++源文件中无效,作为运算符重载的名称。