为什么for_each( ..., _Fn1& _Func )只能接收全局函数而不能接收成员函数?

发布于 2022-09-11 22:50:06 字数 708 浏览 32 评论 0

class MyClass {
public:
    void memberFunc() {
        std::cout << "调用成员函数" << std::endl;
    }
    static void classFunc() {
        std::cout << "调用类函数" << std::endl;
    }
};

void globalFunc() {
    std::cout << "调用全局函数" << std::endl;
}

template<typename _Fn>
void test(_Fn& Func) {
    Func();
}

int main()
{
    test<void()>(globalFunc);
    test<void()>(MyClass().memberFunc);//非标准语法;请使用 "&" 来创建指向成员的指针

}

为什么test<void()>(MyClass().memberFunc);报错?
看网络课程的时候对这部分就不太明白:
image.png
为什么这里的for_each只接受形式1,也就是全局函数式的调用?传过去的不都是函数么?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

温馨耳语 2022-09-18 22:50:06

首先类型就不对

类成员函数的类型应该类似于 (void(A::*)())&A::fun

并且第一个参数应该填写类对象地址(this)

也就是说为了能够接收数据需要两个参数

其次,你获得成员函数的方法能获得类的静态成员函数,不能获得非静态成员函数

最笨的告白 2022-09-18 22:50:06

楼上说的对。实在想用也不是不可以,用std::bind将对象作为第一个参数与成员函数绑定在一起就好了,当然bind之后返回的其实是一个仿函数,不能转成void()。静态函数没有隐含的指针,可以直接转换:

MyClass *p = new MyClass();
auto f = std::bind(&MyClass::memberFunc, p);
test(f);
test<void()>(MyClass::classFunc);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文