如何在 C++ 中将运算符作为函数调用

Posted

技术标签:

【中文标题】如何在 C++ 中将运算符作为函数调用【英文标题】:How to call an operator as function in C++ 【发布时间】:2011-04-27 15:12:20 【问题描述】:

我想调用某个类的特定基类的特定运算符。对于简单的功能很容易:我只写SpecificBaseClass::function( args );。我应该如何为操作员实现相同的功能而不需要施放诡计?

孤立的问题:

 class A
 
 public:
     A operator+( const A &other ) const ...
 ;

 class B : public A
 
 public:
     B operator+( const B & other ) const ...

 ;

 ...
  B a, b;
  B c = A::operator+( a, b ); //how this should be implemented? I get an error
 ...

我从 GCC4.5.1 收到以下错误:

error: no matching function for call to ‘A::operator+(B&, B&)’
note: candidate is: A A::operator+(const A&) const

谢谢


编辑 我已经改进了示例以更好地说明问题。

【问题讨论】:

【参考方案1】:

C++中有两个概念:一个是操作符,另一个是操作符函数。非正式的运算符是广义上的内置运算符。您不能以功能表示法调用它们。运算符函数是所谓的重载运算符,正如从许多答案中已经看到的那样:也就是说,如果 @ 是 A 类的成员二元运算符,则 someObjectOfTypeA.operarot@(someOtherObject),或者如果它是独立函数,则喜欢operator@ (object1, object2)

【讨论】:

【参考方案2】:

将函数指定为的语法

<Class>::<Method>

Method()Class 中的静态方法时使用。如果Method() 是实例方法,则调用是在类对象上。

Class classObject;
classObject.Method()

在这种特殊情况下,operator+() 方法的声明和使用不匹配。

因此,一种方法是使operator+() 方法static。但是,我认为,operator 方法只能是非静态成员函数或非成员函数。

有了所有这些知识,这里有一个完整的说明性程序。

#include <cassert>

struct B 
    int num_;

    B(int num) : num_( num ) 
    

    static B add( const B & b1, const B & b2 ) 
        return B( b1.num_ + b2.num_ );
    

    B operator+( const B & rhs ) 
        return B( num_ + rhs.num_ );
    
;

int main() 
    B a(2), b(3);

    B c = B::add( a, b );
    assert( c.num_ == 5 );

    B d = a + b;
    assert( d.num_ == 5 );

add() 函数仅作为示例,但不要这样做。

【讨论】:

【参考方案3】:

操作符是一个非静态成员函数,所以你可以使用

a.A::operator+( b )

但是,对于将operator+ 定义为静态成员函数的另一个类,您尝试的将是正确的。第三类可能会使其成为免费功能(可以说是最好的方法),所以B::operator+(a,b)a.operator+(b) 都不正确,operator+(a,b) 是正确的。

通常最好只使用运算符语法a+b,除非您确切知道它是什么类,并且它的实现永远不会改变。在模板上下文中,写a+b 是必须的,而且如果没有大量工作,基本上不可能获取重载的地址(需要命名它的唯一任务)。

在您的上下文中(对另一个答案的评论提到模板),最好的解决方案是

c = static_cast< A const & >( a ) + static_cast< A const & >( b );

...问题是通过对类型进行切片以反映子问题来解决的,而不是精确地命名您想要的函数。

【讨论】:

【参考方案4】:

为什么不:

B c = a + b;

【讨论】:

因为他想使用Aoperator+的实现,但是这将使用Boperator+的实现。【参考方案5】:

你不能直接说

c = b + a;

【讨论】:

您假设 + 运算符对于 A 类是对称的。虽然一个好的编码指南会建议这不是语言的要求。【参考方案6】:

尝试:

a.operator+(b);

【讨论】:

在特定情况下,我应该写“ static_cast*>(&a)->operator+(b) ”,这不是很可读

以上是关于如何在 C++ 中将运算符作为函数调用的主要内容,如果未能解决你的问题,请参考以下文章

如何在域类中将 Taglib 作为函数调用

C++类和对象中

c++调用dll导出函数

从 C++ 调用 python 函数时如何将 C++ 类作为参数传递?

C++函数调用运算符 函数对象 函数指针

如何使用 pybind11 在 C++ 线程中调用 Python 函数作为回调