【问题标题】:Define alias to an operator定义运算符的别名
【发布时间】:2019-07-24 15:18:06
【问题描述】:

在 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 更多的选项会更好)。

【问题讨论】:

  • C++ 不允许使用像 这样的符号名称,所以你不能这样做。
  • @πάνταῥεῖ 其他角色怎么样?

标签: c++ syntax operators


【解决方案1】:

C++ 只允许运算符被重载,而不是新定义。因此,您可以重新定义 &lt;&lt; 的功能,但不能定义像 这样的新运算符。

在语言的演变过程中肯定已经考虑过了,Bjarne Stroustrup 本人(编写 C++ 的人)有 explained why 他们决定不允许这样做:

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

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

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

致谢:我从this answer获得了很多灵感。

【讨论】:

    【解决方案2】:

    list 的可用运算符可用于运算符重载。所以你不能为你的自定义字符创建一个运算符来作为你的自定义字符重载运算符。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-11
      • 2013-04-14
      • 1970-01-01
      • 2018-12-17
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      相关资源
      最近更新 更多