2012-10-25 34 views
8

Vui lòng tham khảo đoạn mã sau. Tôi muốn sử dụng std::bind cho chức năng quá tải foobar. Nó chỉ gọi phương thức mà không có đối số.std :: hàm ràng buộc và quá tải

#include <functional> 
#include <iostream> 
class Client 
{ 
    public : 
    void foobar(){std::cout << "no argument" << std::endl;} 
    void foobar(int){std::cout << "int argument" << std::endl;} 
    void foobar(double){std::cout << "double argument" << std::endl;} 
}; 

int main() 
{ 
    Client cl; 
    //! This works 
    auto a1 = std::bind(static_cast<void(Client::*)(void)>(&Client::foobar),cl); 
    a1(); 
    //! This does not 
    auto a2= [&](int) 
    { 
     std::bind(static_cast<void(Client::*)(int)>(&Client::foobar),cl); 
    }; 
    a2(5); 
    return 0; 
} 
+0

Bạn đang thiếu 'return' trong lambda của mình. – ildjarn

Trả lời

11

Bạn cần phải sử dụng placeholders cho các đối số không ràng buộc:

auto a2 = std::bind(static_cast<void(Client::*)(int)>(&Client::foobar), cl, 
        std::placeholders::_1); 
a2(5); 

Bạn cũng có thể thực hiện các ràng buộc với một chụp lambda (lưu ý rằng đây là liên kết cl bằng cách tham khảo, không theo giá trị):

auto a2 = [&](int i) { cl.foobar(i); }; 
+0

Cảm ơn ecatmur, nó hoạt động. – Atul

+0

Và việc chụp theo giá trị có thể được thực hiện với '[&, i]' hoặc '[=, & cl]'. – Xeo

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