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

imr*_*mre 3 c++ lambda boost bind

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

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

Jam*_*lis 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());
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用std::logical_not函数对象std::remove_if:

v.erase(std::remove_if(v.begin(), v.end(), std::logical_not<T>()), v.end());
Run Code Online (Sandbox Code Playgroud)

一个类应该实现一个实际的operator bool()重载是非常罕见的:由于C++类型系统的问题,提供这样的转换使得很容易错误地编写错误的代码,利用你不希望它的转换用过的.实现safe-bool习语而不是实际的operator bool()重载要好得多.这样做的缺点是你实际上无法绑定到operator bool()重载,因为safe-bool习语依赖于转换为某种未指定的类型.