在 C++11 中将成员函数指定为回调
Specifying a member function as a callback in C++11
>我有以下内容:
typedef std::function<bool (const std::string&)> SomethingCoolCb;
class ClassA
{
public:
void OnSomethingCool(const SomethingCoolCb& cb)
{
_cb = cb;
}
private:
SomethingCoolCb _cb;
};
class ClassB
{
public:
ClassB();
bool Juggle(const std::string& arg);
private:
ClassA _obj;
};
我想指定 ClassB::Juggle() 成员函数作为对 ClassB::_obj 的回调。 在 C++11 中执行此操作的正确方法是(在 Class B 的构造函数中):
ClassB::ClassB()
{
_obj.OnDoSomethingCool(
[&](const std::string& arg) -> bool
{
return Juggle(arg);
});
}
据我了解,编译器将从上面的 lambda 代码中创建一个 std::function 对象。 因此,当调用回调时,它将调用 std::function::operator() 成员,然后它将调用 ClassB::Juggle() 而不是直接调用 ClassB::Juggle()。 除非我对幕后发生的事情有误,否则这一切似乎都有点低效。 有没有更好的方法?
仅在确实需要多态函数时才使用 std::function
。否则,请将其设为模板。
若要使成员函数适应函子,请使用std::mem_fn
,然后将对象bind
到第一个参数,生成的函子可以用作回调。
样本:
#include <string>
#include <functional>
template<typename F>
class ClassA
{
public:
ClassA(F f) : _cb(f) {}
private:
F _cb;
};
class ClassB
{
public:
ClassB()
: _obj(std::bind(&ClassB::Juggle, this,
std::placeholders::_1))
{}
bool Juggle(const std::string& arg) {return true;}
private:
ClassA<decltype(std::bind(
std::declval<bool (ClassB::*)(const std::string&)>()
, std::declval<ClassB*>()
, std::placeholders::_1
) ) > _obj;
};
int main()
{
ClassB b;
return 0;
}
这回避了功能的成本,代价是丑陋得可怕。
相关文章:
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- 从不同的 cpp 调用回调函数会导致bad_function_call
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- C 回调函数在对象 pascal 上崩溃
- 类 Referention 中C++回调函数引用非静态函数
- CURLOPT_INTERLEAVEFUNCTION回调函数始终接收 nullptr 作为用户数据指针
- 动态链接库中C++回调函数
- 我想制作设置鼠标回调函数,以便在仍然按下鼠标左键时连续传递坐标
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 我可以使用谷歌 v8 在回调函数中获取 JavaScript 函数C++源文本吗?
- 重写另一个方法 [C++] 使用的超类回调函数
- 是否可以影响 C++ 中回调函数的局部变量?
- C++ Qt5 中带有 pigpio 库的回调函数
- 在定时器回调函数中使用 Sleep() 会导致C++出现问题吗?
- C++在赋值或回调函数时重载模板
- 如何用不同的参数类型和数字回调函数
- 如何为Python Swigged C++对象创建和分配回调函数
- 用回调函数替换C++正则表达式
- C++带有回调函数的模板类