【发布时间】: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