【发布时间】:2019-03-02 14:22:53
【问题描述】:
这个问题可能很幼稚,如果是,请在我学习时原谅我。
请考虑以下类似 C++ 的伪代码:
#include <iostream>
#include <string>
#include <functional>
struct A{
bool doSomething(int in){
std::cout<<"SOMETHING WAS DONE THAT DAY: "<<in<<std::endl;
return true;
}
};
struct B{
std::function executor;
void setExecutor(std::function f){
executor=f;
}
bool doSomethingLater(int in){
return executor(in);
}
};
static bool yoloFunction(int in){
std::cout<<"LIVING LA VIDA LOCA: "<<in<<std::endl;
return false;
}
int main()
{
A myExecutor;
B lazyAss;
// Storing member function for later invocation
lazyAss.setExecutor(&myExecutor::doSomething);
bool result_1 = lazyAss.doSomethingLater(1337);
std::cout<<"The first result is "<<result_1<<std::endl;
// Storing regular function for later invocation
lazyAss.setExecutor(&yoloFunction);
bool result_3 = lazyAss.doSomethingLater(42);
std::cout<<"The second result is "<<result_2<<std::endl;
// Storing lambda function for later invocation
lazyAss.setExecutor([=](int in){
std::cout<<"P- P- P- POKERFACE!: "<<in<<std::endl;
return true;
});
bool result_3 = lazyAss.doSomethingLater(666);
std::cout<<"The third result is "<<result_3<<std::endl;
}
它应该说明我想要完成的工作,即存储某种回调以供以后调用。
那么在不使用 boost 或其他非标准依赖项的情况下,我将如何以最简单的方式在现代 C++ 中执行此操作?
有哪些选择和注意事项?
需要注意的是,回调的签名是事先知道的,不会改变。
我要存储的回调也可以是不同的形式,例如独立函数、成员函数或 lambda。
【问题讨论】:
-
您可能想查看 Stephan T Lavavej 的 Youtube 上关于功能性的谈话youtu.be/zt7ThwVfap0
-
不编译?错误:在没有参数列表的情况下无效使用模板名称“std::function”
-
“请考虑以下类似 C++ 的伪代码:” 这没有帮助。提供minimal reproducible example 重现您的问题,并详细说明您对看到的错误消息的疑问(请逐字引用)。
-
你真的应该把它归结为实际问题。您的问题是关于如何正确设置
std::function的模板参数,是关于如何将绑定到对象的成员函数保存到std::function,还是其他问题? How to store arbitrary method pointers in c++11?, Call a function later, How to bind, store and execute a std::function object?, ... -
我的问题是我不知道该怎么做。如果我知道正确的代码,我会写的!
标签: c++ lambda callback invoke functor