使用指向成员的指针将成员函数作为参数传递
Using pointers to member to pass member function as arguments
#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::)()’
代码中是否存在语法错误,或者由于某种原因这是不可能的?
你不能传递一个非静态成员函数来执行,因为它依赖于 this
元素(所以它需要一个调用对象),相反你可以使用 lambda
:
execute([&](){foo.print();});
#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::)()’
代码中是否存在语法错误,或者由于某种原因这是不可能的?
你不能传递一个非静态成员函数来执行,因为它依赖于 this
元素(所以它需要一个调用对象),相反你可以使用 lambda
:
execute([&](){foo.print();});