C++ C++;boost::bind/lambda和操作符bool()

C++ C++;boost::bind/lambda和操作符bool(),c++,boost,lambda,bind,C++,Boost,Lambda,Bind,如何使用boost::bind或boost::lambda将转换绑定到bool运算符 例如,假设我有一个C类,带有一个操作符bool(),和一个列表。如何使用remove_if和bind/lambda删除所有在转换为bool时计算为false的元素 您不需要为此使用std::bind或std::remove\u标准::删除即可: std::vector<T> v; // Assuming T provides some conversion to bool // Remove al

如何使用boost::bind或boost::lambda将转换绑定到bool运算符


例如,假设我有一个C类,带有一个操作符bool(),和一个
列表。如何使用remove_if和bind/lambda删除所有在转换为bool时计算为false的元素

您不需要为此使用
std::bind
std::remove\u<代码>标准::删除
即可:

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());

<> P>一个类应该实现一个实际的<代码>操作符布尔()/>代码超载:由于C++类型系统的问题,提供这样的转换使得很容易错误地编写不希望使用它的转换代码。实现safe bool习惯用法比实现实际的
操作符bool()
重载要好得多。这样做的缺点是,您实际上无法绑定到
运算符bool()
重载,因为安全bool习惯用法依赖于转换到某个未指定的类型。

如果运算符计算结果为false,则需要删除,请使用std::logical\u not;如果需要删除if true,则可以使用:

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

请注意,
remove
方法与
remove\u if
方法之间存在差异:
remove
方法依赖于
运算符==
的使用,并且不适用于显式不可比较的类型。例如,
remove
方法不适用于一系列
std::function
对象,而适用于
remove\u if
方法,该方法仅依赖于使用
操作符,将正常工作。[我会在某个时候将此编辑到我的答案中。]谢谢。您是对的,在这种情况下,remove(而不是remove_if)是最简单的方法。使用逻辑逻辑推理也不起作用;如果编译器以某种方式自动推导出T,那就更好了。@imre:在这种情况下,编写自己的函数对象非常容易,不需要模板参数:
struct_not{template bool operator()(const T&x){return!x;}[我最终也会将其编辑到我的答案中。]
remove_if(..., ..., bind(&C::operator bool, _1));