C++ boost::bind/lambda 和运算符 bool()
如何使用 boost::bind 或 boost::lambda 绑定转换为布尔运算符?
例如,假设我有一个类 C,带有一个运算符 bool() 和一个 list
。如何使用remove_if和bind/lambda删除所有在转换为bool时计算结果为false的元素?
How do I bind a conversion-to-bool operator using boost::bind or boost::lambda?
For example, suppose I have a class C, with an operator bool(), and a list<C>
. How do I use remove_if and bind/lambda to remove all elements that, when converted to bool, evaluate to false?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您不需要为此使用
std::bind
或std::remove_if
;std::remove
就足够了:或者,您可以将
std::logic_not
函数对象与std::remove_if
一起使用:这是非常罕见的一个类应该实现一个实际的
operator bool()
重载:由于C++类型系统的问题,提供这样的转换很容易错误地编写错误的代码,在您需要的地方使用该转换不要指望它会被使用。实现 safe-bool 习惯用法比实际的operator bool()
重载要好得多。这样做的缺点是您实际上无法绑定到运算符 bool() 重载,因为 safe-bool 习惯用法依赖于到某些未指定类型的转换。You don't need to use
std::bind
orstd::remove_if
for this;std::remove
will suffice:Or, you can use the
std::logical_not
function object withstd::remove_if
:It is very rare that a class should implement an actual
operator bool()
overload: due to problems with the C++ type system, providing such a conversion makes it very easy to mistakenly write incorrect code that makes use of the conversion where you don't expect it to be used. It is far better to implement the safe-bool idiom instead of an actualoperator bool()
overload. The downside of this is that you can't actually bind to theoperator bool()
overload since the safe-bool idiom relies on a conversion to some unspecified type.如果您需要在运算符计算结果为 false 时删除,请使用 std::logic_not ;如果您需要删除 if true,那么您可以使用:
use std::logical_not if you need to remove if the operator evaluates to false; if you need to remove if true, then you can use: