正确使用 boost lambda

Posted

技术标签:

【中文标题】正确使用 boost lambda【英文标题】:Correct use of boost lambda 【发布时间】:2010-05-13 11:49:58 【问题描述】:

考虑以下一段 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]);
  );

它在 Boost Lambda 中的正确外观如何(因为这个 C++0x 功能还不能在 GCC 4.4 中使用)?

【问题讨论】:

如果编译器支持,您可以使用 C++0x 功能。 天哪,痛苦!让它停下来! (不过,这是个好问题。) @KennyTM 我有 GCC 4.4,但它还不支持它。 GCC 4.5 支持它(afaik),但我不能使用它。我将编辑问题... 【参考方案1】:

我认为这应该可行:

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的成员。

但老实说,我个人会拒绝使用这样的代码:)

【讨论】:

谢谢。如果我能完全使用 C++0x,我会非常高兴:)。使用您的解决方案,我在调用_buffer[_1] 的行中得到no match for operator[] .. 但缓冲区类中存在operator[]。你知道如何解决它吗? @Niels,我忘了用var(..) 包装它们。固定:) 现在在boost::bind(&amp;any_cast&lt;string&gt;, boost::ref(var(_buffer)[lambda::_1])) == "foo" 行中,我得到bind(&lt;unresolved overloaded function type&gt;, const boost::reference_wrapper ... 的不匹配函数调用。我包含了boost/lambda/bind.hpp,并且另一个绑定调用没有失败...... @Niels,你需要投射。固定 +1 表示拒绝使用此类代码。我同意,不仅仅是我不会写那样的代码,我绝不会允许这样的代码通过代码审查(当然,除非我被否决了,但你明白了)。

以上是关于正确使用 boost lambda的主要内容,如果未能解决你的问题,请参考以下文章

boost中Function和Lambda的使用

如何使用 Boost lambda 将 remove_if 与 UUID 比较应用?

使用 boost::mutex - 隐式删除错误(因为默认定义格式不正确)

正确使用 boost::wait_for_any

使用 boost::variant 库制作地图。如何将事物存储和显示为正确的类型?

VS2015编译使用Boost库遇到的问题及正确编译使用教程