将成员函数传递给重载运算符

时间:2019-05-09 15:06:04

标签: c++ operator-overloading parameter-passing c++17 member-functions

我想对流重载运算符<<,以便当我使用需要一个流的函数调用它时,它将调用该函数(以优化字符串连接)。但是,它似乎不适用于成员函数。

#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;
}

有什么办法可以使这项工作成功吗?

0 个答案:

没有答案