如何使用boost :: bind或boost :: lambda绑定一个conversion-to-bool运算符?C++ boost :: bind/lambda和运算符bool()
例如,假设我有一个C类,带有运算符bool()和一个list<C>
。我如何使用remove_if和bind/lambda来删除转换为bool时计算为false的所有元素?
如何使用boost :: bind或boost :: lambda绑定一个conversion-to-bool运算符?C++ boost :: bind/lambda和运算符bool()
例如,假设我有一个C类,带有运算符bool()和一个list<C>
。我如何使用remove_if和bind/lambda来删除转换为bool时计算为false的所有元素?
您不需要为此使用std::bind
或std::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_if
的std::logical_not
函数对象:
v.erase(std::remove_if(v.begin(), v.end(), std::logical_not<T>()), v.end());
这是非常罕见的一类应该实现的实际operator bool()
超载:对与C问题,是由于++提供这种转换使得错误地编写不正确的代码非常容易,因为这些代码会在您不希望使用的转换中使用转换。实施安全布尔成语而不是实际的过载要好得多。这个缺点是你不能绑定到operator bool()
重载,因为safe-bool习惯用法依赖于转换为某种未指定的类型。
如果您需要删除操作符评估为false,则使用std :: logical_not;如果你需要真正的,如果删除,那么你可以使用:
remove_if(..., ..., bind(&C::operator bool, _1));
注意这里是`remove`方法和`remove_if`方法之间的差异:在`remove`方法依赖于运营商使用的`= =`并且不适用于明确不相等的类型。例如,'remove'方法不适用于一系列`std :: function`对象,但'remove_if`方法仅依赖于`operator!`,它可以很好地工作。 [我会在某种程度上将其编辑到我的答案中。] – 2011-02-07 15:29:28