Вам не нужно использовать 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 ++ обеспечение такого преобразования позволяет очень легко ошибочно написать неправильный код, который использует преобразование там, где вы не работаете не ожидайте, что это будет использовано. Гораздо лучше реализовать идиому «безопасный bool» вместо фактической перегрузки operator bool()
. Недостатком этого является то, что на самом деле вы не можете привязать к перегрузке operator bool()
, поскольку идиома safe-bool основывается на преобразовании в какой-то неопределенный тип.