2012-04-08 8 views
11

我有這個代碼,不知道我想實現的是否可能。如何在其內部使用lambda函數?

_acceptor.async_accept(
    _connections.back()->socket(), 
    [this](const boost::system::error_code& ec) 
    { 
     _connections.push_back(std::make_shared<TcpConnection>(_acceptor.get_io_service())); 
     _acceptor.async_accept(_connections.back()->socket(), this_lambda_function); 
    } 
); 

一旦套接字被接受,我想重用處理程序(又名lambda函數)。這可能嗎?有沒有更好的方法來完成這一點?

+0

+1非常有趣的問題。我以前沒有想到這一點。 – templatetypedef 2012-04-08 19:21:07

+1

https://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/f1b3569c8aac0660?pli=1 – Anonymous 2012-04-08 19:27:56

+0

與您的問題無關,但您應該知道前導下劃線(以及兩個相鄰的下劃線)是保留的,不應該用於應用程序標識符。 – Marc 2012-04-10 23:44:36

回答

9

你必須存儲在自身的拉姆達的副本,使用std::function<>(或類似的東西)作爲中介:

std::function<void(const boost::system::error_code&)> func; 
func = [&func, this](const boost::system::error_code& ec) 
{ 
    _connections.push_back(std::make_shared<TcpConnection>(_acceptor.get_io_service())); 
    _acceptor.async_accept(_connections.back()->socket(), func); 
} 

_acceptor.async_accept(_connections.back()->socket(), func); 

但是,你只能通過參考做到這一點;如果你試圖通過價值來捕獲它,它將無法工作。這意味着你必須限制這種lambda的使用,以便通過引用來捕獲是有意義的。所以如果你在異步函數完成之前離開這個範圍,它會中斷。

你的另一種選擇是創建一個合適的仿函數而不是lambda。最終,lambda不能做任何事情。

+0

我們不能使用'auto'? – balki 2012-04-11 18:21:18

+0

@balki:不。在C/C++中用一個使用變量名稱的表達式初始化一個變量是合法的。但是,在處理'auto'變量時,它會被關閉,因爲只有當表達式的類型可以確定時,變量名才具有類型。 – 2012-04-11 18:23:39

相關問題