2010-05-13 85 views
10

考慮下面的一段的C++ 0x代碼:正確使用升壓拉姆達的

a_signal.connect([](int i) { 
    if(boost::any_cast<std::string>(_buffer[i]) == "foo") 
    { 
    base_class<>* an_object = new derived_class(); 
    an_object->a_method(_buffer[i]); 
    }}); 

它會如何正確看在升壓LAMBDA(因爲這的C++ 0x功能不能在GCC 4.4中使用然而)?

+0

如果編譯器支持它,您*可以*使用C++ 0x功能。 – kennytm 2010-05-13 11:51:57

+2

OMG,痛苦!讓它停止! (不過,好的問題。) – 2010-05-13 11:52:35

+0

@KennyTM我有GCC 4.4,它不支持它。 GCC 4.5支持它(afaik),但我無法使用它。我會編輯這個問題... – 2010-05-13 11:53:55

回答

11

我認爲這應該工作:

a_signal.connect(if_then(
        bind((std::string(*)(any&))&any_cast, var(_buffer)[_1]) == "foo", 
        bind(&base_class<>::a_method, 
        ll_static_cast< base_class<>* >(
        new_ptr<derived_class>() 
        ), 
        var(_buffer)[_1] 
        ) 
       ) 
); 

bindif_thenll_static_castnew_ptr_1var(和,我想ref太)是boost::lambda成員。

但是,老實說,我會拒絕使用這樣的代碼,個人:)

+2

+1這看起來很可怕:) – 2010-05-13 12:20:09

+0

謝謝。如果我可以完全使用C++ 0x,我會非常開心:)。在你的解決方案中,我會在調用'_buffer [_1]'的行中得到'不匹配operator []',但緩衝區類中存在'operator []'。你有一個想法如何解決它? – 2010-05-13 12:27:05

+0

@Niels,我忘了把它們包裝在'var(..)'中。修正:) – 2010-05-13 12:28:27