2013-10-22 11 views
5

Xét đoạn mã sau:C++ Lambda: Truy cập phương pháp tĩnh trong lambda dẫn đến lỗi 'này không bị chiếm đóng cho chức năng lambda này'

//this is what I want to call; I cannot modify its signature 
void some_library_method(void(*fp)(void)); 

class Singleton{ 
    public: 
     static Singleton *instance(); 
     void foo(); 
     void bar(); 
    private: 
     Singleton(); 
}; 

void Singleton::foo(){ 
    //this leads to an error ('this' was not captured for this lambda function) 
    void(*func_pointer)(void) = []{ 
     Singleton::instance()->bar(); 
    }; 
    some_library_method(func_pointer); 
} 

Tôi muốn gọi một chức năng tôi không thể thay đổi (xem some_library_method trên) mà hy vọng một con trỏ hàm làm đối số. Cuộc gọi nên được thực hiện trong một thành viên lớp học foo(). Tôi biết rằng tôi không thể truy cập vào các thành viên lớp học ở đó, nhưng tất cả những gì tôi muốn làm là truy cập Class Singleton theo một cách tĩnh (lấy ví dụ singleton).

Có cách nào cải cách biểu thức lambda để hiển thị trình biên dịch mục tiêu, g ++ v4.7.2, rằng nó thực sự không cần tham chiếu đến this?

Trả lời

2

Sau đây công việc xung quanh hoạt động:

template< typename T > T* global_instance() { return T::instance(); } 

void(*func_pointer)(void) = []{ 
    global_instance<Singleton>()->bar(); 
}; 
+0

tuyệt vời, cảm ơn bạn – muffel

1

Bạn có thể sử dụng một chức năng thường xuyên được xác định tại địa phương thay vì một lambda cho rằng

void Singleton::foo() { 
    struct T { 
     static void cb(){ Singleton::instance()->bar(); } 
    }; 
    some_library_method(T::cb); 
} 
+0

'T' có vẻ như một người nghèo lựa chọn tên cho loại đó. – Yakk

+0

giải pháp thú vị, cảm ơn! – muffel

+0

@Yakk: IMO 'LocalStructureNeededBecauseCppDoesntAllowLocalFunctions' sẽ tồi tệ hơn :-) – 6502

Các vấn đề liên quan