我有以下内容:
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;
};
Run Code Online (Sandbox Code Playgroud)
我想指定ClassB :: Juggle()成员函数作为ClassB :: _ obj的回调.在C++ 11中这样做的正确方法是(在ClassB的构造函数中):
ClassB::ClassB()
{
_obj.OnDoSomethingCool(
[&](const std::string& arg) -> bool
{
return Juggle(arg);
});
}
Run Code Online (Sandbox Code Playgroud)
据我所知,编译器将使用上面的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;
}
Run Code Online (Sandbox Code Playgroud)
这方面以牺牲可怕的丑陋为代价来降低功能成本.
| 归档时间: |
|
| 查看次数: |
3776 次 |
| 最近记录: |