如何将类的重载运算符成员作为函数指针传递?

时间:2013-08-02 09:13:29

标签: c++ types parameters overloading function-pointers

例如,如果我想传递

ostream& std::ostream::operator << (int i);  

进入

等功能
void func(ostream& (*out)(int), ...);

然后我该怎么做呢?

func(std::ostream::operator << (int))

肯定不起作用

typedef ostream& (*out)(int);
out o = std::ostream::operator << (int);
func(o);
尝试分配o时,

会抛出编译时错误。那么如何指出重载运算符呢? (在这种情况下,强制输出也不起作用)


在玩完代码之后,我现在的问题是:为什么非成员,重载运算符,即

ostream& operator << (ostream&, classX) 

返回void *而不是指向函数的指针?

如果我这样做

typedef ostream& (*out)(ostream&,classX);

我只能做到

void* v = ostream& operator << (ostream&,classX);

而不是

out o = ostream& operator << (ostream&,classX);

打印错误消息

190: error: invalid conversion from 'void*' to 'std::ostream& (*)(std::ostream&, classX)'

2 个答案:

答案 0 :(得分:2)

取决于您如何使操作员超载。

函数的签名(指向的指针的类型)是:

  • RETURN_TYPE(*)(PARAMETERS_TYPES)如果它是一个全局函数。
  • RETURN_TYPE (CLASS_NAME::*)(PARAMETERS_TYPES)如果是其成员函数。

如果你有一个名为f的函数和一个将函数指针作为参数获取的函数,则f传递如下:

  • g(f)如果f是全局函数。
  • g(&CLASS_NAME::f)如果f是CLASS_NAME类的成员函数。

请注意,函数指针和成员函数指针不兼容。

因此,如果您的运算符作为成员函数重载,例如operator+=,您应该使用第二个版本。如果没有,你应该使用第一个。

答案 1 :(得分:0)

我会在这里简化作业。没有必要指定整个签名,因为可以从左侧的类型推断出正确的重载。

#include <iostream>
using namespace std;

struct Foo
{
    int x;
};

ostream& operator<< (ostream &a, const Foo& b)
{
    return a << b.x;
}

typedef ostream& (*Func) (ostream &, const Foo&);

int main() {
    Func func = &operator<<;
    (*func)(cout, Foo{42});
}