c++ - 使用指向成员的指针将成员函数作为参数传递
问题描述
#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::)()’
代码中是否存在语法错误,或者由于某种原因这是不可能的?
解决方案
You can't pass a non-static member function to execute, because it depends on the this
element (and so it needs an invocation object), instead you can use a lambda
:
execute([&](){foo.print();});
推荐阅读
- python-3.x - 如何在 Mac 上安装 python pdal?
- ios - Swift iOS背景颜色视图动画作为计时器
- c++ - 如何让我的代码从矩阵中输出非零元素?
- apache-tika - Apache Tika 无法从 PDF 中正确提取印度语言的文本
- javascript - JQUERY:从 URL 获取 JSON 数据
- laravel - 如何在 elequent 模型的验证规则上使用配置变量?
- obiee - 是否可以在 OBIEE 11g 仪表板提示中使用数千个分隔符?
- ios - iOS MFMailComposeViewController 未附加文件
- c# - 类之间的代码交互?C# 视觉工作室
- javascript - 将ostream分配给c ++中的数据类型字符串