2010-05-13 58 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