在C ++中,我可以通过typedef
语句为现有类型定义别名。
但是可以为操作员创建别名吗?
具体来说,我想选择一些Unicode符号并为<<
运算符创建别名。
例如,我要使用“垂直四点” 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更多的选项)。
答案 0 :(得分:4)
C ++仅允许重载,而不允许新定义。因此,您可以重新定义<<
的功能,但不能定义像⁞
这样的新运算符。
在语言的发展过程中当然已经考虑了这一点,Bjarne Stroustrup本人(写C ++的人)已经explained why他们决定不允许它:
我可以定义自己的运算符吗?
对不起,不。可能性已经被考虑了几次,但是每次 我/我们决定可能的问题胜过可能的时间 好处。这不是语言技术问题。即使我第一次 考虑到它是在1983年,我知道该如何实施。但是,我的 经验是,当我们超越最琐碎的例子 人们似乎对“显而易见的”有不同的看法 使用运算符的含义。一个经典的例子是a ** b ** c。假设 **表示乘幂。现在应该意味着 (a ** b)** c还是a **(b ** c)?我以为答案很明显,而我 朋友同意-然后我们发现我们不同意 解决方案是显而易见的。我的推测是这样的问题 会导致细微的错误。
最好的办法是添加一个构建步骤,然后将编译单元传递给编译器,以⁞
替换<<
。根据您的构建环境,使用make
文件或等效文件可能很简单。
致谢:this answer给了我很多启发。
答案 1 :(得分:0)
有list个可用的运算符可用于运算符重载。因此,您无法为自定义字符创建运算符,使其成为自定义字符重载运算符。
除此之外,C++ standard定义了可用于编写程序的字符集。 unicode字符在C ++源文件中作为运算符重载的名称无效。