例如,如果我想传递
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)'
答案 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});
}