【问题标题】:Using pointers to member to pass member function as arguments使用指向成员的指针将成员函数作为参数传递
【发布时间】:2020-06-09 16:47:38
【问题描述】:
#include <iostream>
#include <functional>

class Foo 
{
    public:
    Foo(int value)
    : value_(value){}
    void print()
    {
        std::cout << "member print: " << value_ << std::endl;
    }
    int value_;
};

void print()
{
    std::cout << "stand alone print" << std::endl;
}

template<typename F>
void execute(F&& f)
{
    f();
}

int main()
{ 

    execute(print);

    Foo foo(5);

    auto binded = std::bind(&Foo::print,foo);
    execute(binded);

    //auto Foo::* foo_print = &Foo::print;
    //execute(foo.*foo_print);

}

上面的代码编译运行良好。

但如果最后一部分使用指向 print 成员函数的指针未注释,则编译失败并显示:

error: invalid use of non-static member function of type ‘void (Foo::)()’ 

代码中是否存在语法错误,或者由于某种原因这是不可能的?

【问题讨论】:

  • 指向成员函数的实际指针在汇编级别与指向普通函数的指针相同。因此,要调用它,您必须以某种方式绑定对象。
  • 您到底想在那里实现什么? Foo::print 需要调用一个对象,因为它不是静态的。使用foo.*foo_print,您仍然只能获得该成员函数,但不会绑定到对象。
  • @t.niese 直觉上,我选择了“foo”。 "foo.*foot_print" 可能是绑定函数的部分。
  • @Vince 如果是这样的话,std::bind 不需要 foo 作为单独的参数
  • 一个非静态成员变量对于类的每个实例都有一个唯一的地址。成员函数不会(必然/概念上)。想想一个成员函数只有一个地址,不管你创建了多少类实例。

标签: c++ function-pointers member-function-pointers function-binding


【解决方案1】:

您不能传递非静态成员函数来执行,因为它依赖于this 元素(因此它需要一个调用对象),您可以使用lambda

execute([&](){foo.print();});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-11
    • 2012-07-22
    • 2013-06-29
    • 2012-06-27
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多