如何使用boost :: bind或boost :: lambda绑定转换为bool的运算符?
例如,假设我有一个C类,一个运算符bool()和一个list<C>
。如何使用remove_if和bind / lambda删除转换为bool时评估为false的所有元素?
答案 0 :(得分:5)
您无需使用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::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));