Tôi đã điều sau đây:Xác định một hàm thành viên như một callback trong 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;
};
và tôi muốn xác định ClassB :: Juggle() chức năng thành viên như gọi lại để ClassB :: _ obj. Sẽ cách thích hợp để làm điều đó trong C++ 11 được (trong constructor ClassB của):
ClassB::ClassB()
{
_obj.OnDoSomethingCool(
[&](const std::string& arg) -> bool
{
return Juggle(arg);
});
}
Từ những gì tôi hiểu, trình biên dịch sẽ làm cho một đối tượng std :: chức năng ra của mã lambda trên. Vì vậy, khi gọi lại được gọi, nó sẽ gọi thành phần std :: function :: operator() và sau đó nó sẽ gọi ClassB :: Juggle() thay vì gọi ClassB :: Juggle() trực tiếp. Trừ khi tôi nhầm lẫn về những gì xảy ra dưới sự che chở, tất cả dường như không hiệu quả chút nào. Có cách nào tốt hơn?
Hãy coi chừng việc chụp 'this' trong lambda (như trong ví dụ của bạn) không hoạt động tốt với Visual Studio 2010. –