2011-02-07 69 views
3

如何使用boost :: bind或boost :: lambda绑定一个conversion-to-bool运算符?C++ boost :: bind/lambda和运算符bool()

例如,假设我有一个C类,带有运算符bool()和一个list<C>。我如何使用remove_if和bind/lambda来删除转换为bool时计算为false的所有元素?

回答

5

您不需要为此使用std::bindstd::remove_if; std::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::remove_ifstd::logical_not函数对象:

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

这是非常罕见的一类应该实现的实际operator bool()超载:对与C问题,是由于++提供这种转换使得错误地编写不正确的代码非常容易,因为这些代码会在您不希望使用的转换中使用转换。实施安全布尔成语而不是实际的过载要好得多。这个缺点是你不能绑定到operator bool()重载,因为safe-bool习惯用法依赖于转换为某种未指定的类型。

+0

注意这里是`remove`方法和`remove_if`方法之间的差异:在`remove`方法依赖于运营商使用的`= =`并且不适用于明确不相等的类型。例如,'remove'方法不适用于一系列`std :: function`对象,但'remove_if`方法仅依赖于`operator!`,它可以很好地工作。 [我会在某种程度上将其编辑到我的答案中。] – 2011-02-07 15:29:28

0

如果您需要删除操作符评估为false,则使用std :: logical_not;如果你需要真正的,如果删除,那么你可以使用:

remove_if(..., ..., bind(&C::operator bool, _1)); 
相关问题