正确使用 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]
)
)
);
bind
、if_then
、ll_static_cast
、new_ptr
、_1
、var
(我也认为ref
)是boost::lambda
的成员。
但老实说,我个人会拒绝使用这样的代码:)
【讨论】:
谢谢。如果我能完全使用 C++0x,我会非常高兴:)。使用您的解决方案,我在调用_buffer[_1]
的行中得到no match for operator[]
.. 但缓冲区类中存在operator[]
。你知道如何解决它吗?
@Niels,我忘了用var(..)
包装它们。固定:)
现在在boost::bind(&any_cast<string>, boost::ref(var(_buffer)[lambda::_1])) == "foo"
行中,我得到bind(<unresolved overloaded function type>, const boost::reference_wrapper ...
的不匹配函数调用。我包含了boost/lambda/bind.hpp
,并且另一个绑定调用没有失败......
@Niels,你需要投射。固定
+1 表示拒绝使用此类代码。我同意,不仅仅是我不会写那样的代码,我绝不会允许这样的代码通过代码审查(当然,除非我被否决了,但你明白了)。以上是关于正确使用 boost lambda的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Boost lambda 将 remove_if 与 UUID 比较应用?
使用 boost::mutex - 隐式删除错误(因为默认定义格式不正确)