2012-04-08 24 views
11

Bu koda sahibim ve neyi başarmak istediğimin mümkün olup olmadığını bilmiyorum.Lambda işlevini kendi içinde nasıl kullanabilirim?

_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); 
    } 
); 

bir soket kabul edildikten sonra, ben (lamda işlevi aka) işleyicisi yeniden istiyoruz. Mümkün mü? Bunu başarmanın daha iyi bir yolu var mı?

+0

+1 Çok ilginç bir soru. Bunu daha önce düşünmemiştim. – templatetypedef

+1

https://groups.google.com/group/comp.lang.c++.moderated/browse_thread/thread/f1b3569c8aac0660?pli=1 – Anonymous

+0

Sorunuzla ilgili değil, ancak önde gelen altçizgi (ve iki bitişik alt çizgi) bilmeniz gerekir. uygulama tanımlayıcıları için ayrılmıştır ve kullanılmamalıdır. – Marc

cevap

9

Sen std::function<> (ya da bir şey benzer) bir aracı olarak kullanarak, kendi içinde lambda bir kopyasını saklamak zorunda:

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); 

Ama referans tarafından bunu yalnızca yapabilirsiniz; Eğer değeri yakalamaya çalışırsanız, işe yaramaz. Bu, böyle bir lambda kullanımını sınırlamak zorunda olduğunuz anlamına gelir. Bu kapsamı, uyumsuz fonksiyonunuz bitmeden önce bırakırsanız, kırılır.

Diğer alternatifiniz, lambda yerine uygun bir functor oluşturmaktır. Sonunda, lambiler her şeyi yapamaz.

+0

'auto' kullanamaz mıyız? – balki

+0

@balki: Hayır. Değişken adını kullanan bir ifadeyle bir değişkeni başlatmak için C/C++ 'da yasaldır. Ancak, 'auto' değişkenleriyle uğraşırken bu kapatılır, çünkü değişken adı, ifadenin türü belirleninceye kadar bir türe sahip değildir. –

İlgili konular