为操作员定义别名

时间:2019-03-02 23:33:57

标签: 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 ;   

代替此:

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

如果“四点”字符不可能,但是其他一些符号,也可以选择(尽管最好有比基本ASCII更多的选项)。

2 个答案:

答案 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 ++源文件中作为运算符重载的名称无效。