C ++ boost :: bind / lambda和operator bool()

时间:2011-02-07 14:51:06

标签: c++ boost lambda bind

如何使用boost :: bind或boost :: lambda绑定转换为bool的运算符?

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

2 个答案:

答案 0 :(得分: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::logical_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()重载要好得多。这样做的缺点是你实际上无法绑定到operator bool()重载,因为safe-bool习语依赖于转换为某种未指定的类型。

答案 1 :(得分:0)

如果运算符求值为false,则需要删除std :: logical_not;如果你需要删除if,那么你可以使用:

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