【问题标题】:Correct use of boost lambda正确使用 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),但我不能使用它。我将编辑问题...

标签: c++ c++11 boost-lambda


【解决方案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 表示拒绝使用此类代码。我同意,不仅仅是我不会写那样的代码,我绝不会允许这样的代码通过代码审查(当然,除非我被否决了,但你明白了)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多