2013-02-25 27 views
6

Boost Lambda/Phoenix, lambda gibi başka bir lambda döndüren bir kutuyu destekliyor mu?Boost Lambda/Phoenix - başka bir lambda döndüren lambda nasıl yapılır?

std::cout << [](int x){return [=](int y){return x+y;};}(1)(2); 

Nasıl (- biz polimorfik davranış alacağı prim olarak +) Boost Lambda/Phoenix ile benzer amaca ulaşmak için: currying çeşit yapmak için kullanılabilecek

Örneğin

?

+0

Bu arg1' dıştaki 'bind' tarafından yutulacak' olmasıdır cevaplamak için çalışıyoruz vardı sorun - Ben bir 'arg1' istiyorum 'iç' bağlayabilirsiniz, ama dış 'bağlama' yerine onu yiyor. Eğer argüman yer tutucudan "kaçmak" için bir yolum olsaydı, ... – Yakk

+0

@Yakk, boost :: bind - AFAIK'yi lambda/phoenix bind'den farklı olarak kullanmaya çalışabilirdiniz (http://www.boost.org/doc/ libs/1_53_0/doc/html/lambda/s08.html # idp111396608). Ayrıca, bir cevap olarak deneyin posta kodu - yarın sona erer ... – qble

cevap

5

Boost Phoenix Scope: let/lambda

Live demo:

#include <boost/phoenix.hpp> 
#include <iostream> 
#include <ostream> 

using namespace std; 
using namespace boost; 
using namespace phoenix; 
using namespace arg_names; 
using namespace local_names; 

int main() 
{ 
    // capture by reference: 
    cout << 
     (lambda(_a=_1)[_1 + _a ])(1)(2) 
    << endl; 
    cout << 
     (lambda(_b=_1)[lambda(_a=_1)[_1 + _a + _b ]])(1)(2)(3) 
    << endl; 
    // capture by value: 
    cout << 
     (lambda(_a=val(_1))[_1 + _a ])(1)(2) 
    << endl; 
    cout << 
     (lambda(_b=val(_1))[lambda(_a=val(_1))[_1 + _a + _b ]])(1)(2)(3) 
    << endl; 
} 

Çıktı geçerli:

3 
6 
3 
6 
+0

Ben bu yüzden, aradığımı teşekkürler! – qble

+0

@EvgenyPanasyuk '[&]() -> void {full_bound_expression_that_does_not_run_until_later; gibi tembel bir değerlendirme oluşturmanın kolay bir yolu var. } '? – Yakk

+0

@Yakk, Lütfen, (C++ 11 lambdas ile tam örnekle) ne demek istiyorsunuz? Http://liveworkspace.org/code/30jCv6$0 kastediyor musunuz? Ya da belki http://liveworkspace.org/code/2Kon3g$0? –