C ++中用户定义的运算符

时间:2011-02-26 23:46:56

标签: c++ operators

您如何看待在C ++中指定用户定义的运算符的虚构可能性。

这样的用户定义的运算符可以通过运算符名称(允许的字符的任意序列?),它的优先级,关联性和arity(其他东西?)来定义。

它们可用于多种用途:帮助构建基于C ++的“微小”DSL,用于列表理解等。

此功能不会扩展语言的可能用途吗?什么是允许用户定义的运营商的其他语言? Lisp浮现在脑海中,还有什么?有关该主题的任何链接?

5 个答案:

答案 0 :(得分:7)

嗯,你知道,Bjarne Stroustrup提出了这样的建议...... Generalizing Overloading for C++2000。 :-P :-P :-P

答案 1 :(得分:4)

嗯,Haskell具有可设置优先级和左右绑定的自定义运算符。所以,它可以工作。但是,Haskell虽然主要是被一些相当聪明的人所使用,但它的前沿几乎没有可读性。 (Haskell吓跑了所有的新手,我想......)

对于C ++,我认为有:

  • 解析问题(考虑std::vector<std::list<int>>错误,其中>>被解析为右移运算符.C ++的语法很难。
  • 向后兼容性问题(引入新的运算符,如旧的组合,如! - 可能会导致问题)
  • 清晰度问题(人们对常规操作员做了很多奇怪的事情,使得程序的行为难以理解为神圣。)

后者是交易破坏者,IMO。

然而,没有什么能阻止你编写一个c ++ - 预处理器/解析器,用真正的函数调用替换你自己定义的运算符,然后使用普通的c ++编译器(就像之前的c ++是如何构建的)。如果你保持足够的理智去运输,那将是一个很好的实验。 ; - )

答案 2 :(得分:1)

我无法理解这些运营商的优势。功能和方法足以满足我能想到的各种用途。

我认为这样的可能性只会使C ++变得更复杂并降低源的可读性。在某些来源中,操作员压倒一切已经是如此混乱,我无法想象有些人会对操作员的定义做些什么......

顺便说一句,我真的不明白你的意思是“基于C ++的小型DNS”

答案 3 :(得分:1)

因此,假设您将**定义为“作为用户操作员的权力”。

现在你有了这样的代码:

double d1 = 2.5;
double *pd1 = &d1;
double d2 = 3.0**pd1;

如果没有“operator **”,上面的代码实际上是合法的,它被解析为3.0 * (*pd1)(结果是7.5)

编译器是否会知道**是否如上所述或尝试执行“power”(并抱怨右侧是指针)。

说过我确实认为&&=||=甚至^^^^=都应该添加为运算符。 (我不认为^^是逻辑xor,如果其中一个表达式非零,则给出一个真值。)

答案 4 :(得分:0)

您可能正在混合概念 - 用户定义的运算符重载是可以的。这是因为编译器已经知道C ++定义的运算符的语法规则。

用户定义的操作符“本身” - 没有。想象一下,能够将“Klingon”这个词变成一个运算符 - 它如何区分运算符和变量?