我想对流重载运算符<<,以便当我使用需要一个流的函数调用它时,它将调用该函数(以优化字符串连接)。但是,它似乎不适用于成员函数。
#include <iostream>
std::ostream& operator<< (std::ostream& s, void(*f)(std::ostream&)) {
f(s);
return s;
}
void hello (std::ostream& s) {
s << "Hello, World!";
}
class Foo {
public:
void hello (std::ostream& s) {
s << "Hello from class.";
}
};
int main(int argc, char const *argv[])
{
// This works
std::cout << hello << std::endl;
// This doesn't
Foo o;
std::cout << o.hello << std::endl;
return 0;
}
此代码无法编译,并显示错误“错误:无效使用非静态成员函数'void Foo :: hello(std :: ostream&)'”。经过一番搜索之后,我发现我需要一个函数,该函数以void(Foo::*)()
的形式指向成员的指针,但是将以下内容添加到代码顶部并没有使代码得以编译。
template <typename T>
std::ostream& operator<< (std::ostream& s, void(T::*f)(std::ostream&)) {
f(s);
return s;
}
有什么办法可以使这项工作成功吗?