C++ boost::bind/lambda 和运算符 bool()

发布于 2024-10-16 00:40:02 字数 169 浏览 2 评论 0原文

如何使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

盛装女皇 2024-10-23 00:40:02

您不需要为此使用 std::bindstd::remove_ifstd::remove 就足够了:

std::vector<T> v; // Assuming T provides some conversion to bool

// Remove all elements that evaluate to 'false':
v.erase(std::remove(v.begin(), v.end(), false), v.end());

或者,您可以将 std::logic_not 函数对象与 std::remove_if 一起使用:

v.erase(std::remove_if(v.begin(), v.end(), std::logical_not<T>()), v.end());

这是非常罕见的一个类应该实现一个实际的operator bool()重载:由于C++类型系统的问题,提供这样的转换很容易错误地编写错误的代码,在您需要的地方使用该转换不要指望它会被使用。实现 safe-bool 习惯用法比实际的 operator bool() 重载要好得多。这样做的缺点是您实际上无法绑定到运算符 bool() 重载,因为 safe-bool 习惯用法依赖于到某些未指定类型的转换。

You don't need to use std::bind or std::remove_if for this; std::remove will suffice:

std::vector<T> v; // Assuming T provides some conversion to bool

// Remove all elements that evaluate to 'false':
v.erase(std::remove(v.begin(), v.end(), false), v.end());

Or, you can use the std::logical_not function object with std::remove_if:

v.erase(std::remove_if(v.begin(), v.end(), std::logical_not<T>()), v.end());

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 actual operator bool() overload. The downside of this is that you can't actually bind to the operator bool() overload since the safe-bool idiom relies on a conversion to some unspecified type.

痴梦一场 2024-10-23 00:40:02

如果您需要在运算符计算结果为 false 时删除,请使用 std::logic_not ;如果您需要删除 if true,那么您可以使用:

remove_if(..., ..., bind(&C::operator bool, _1));

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:

remove_if(..., ..., bind(&C::operator bool, _1));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文