C ++ boost :: bind / lambda и оператор bool () - PullRequest
3 голосов
/ 07 февраля 2011

Как связать оператор преобразования в bool, используя boost :: bind или boost :: lambda?

Например, предположим, у меня есть класс C с оператором bool () и list<C>. Как использовать remove_if и bind / lambda для удаления всех элементов, которые при преобразовании в bool оцениваются как false?

Ответы [ 2 ]

5 голосов
/ 07 февраля 2011

Вам не нужно использовать 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 основывается на преобразовании в какой-то неопределенный тип.

0 голосов
/ 07 февраля 2011

используйте std :: logic_not, если вам нужно удалить, если оператор оценивается как false; если вам нужно удалить, если true, то вы можете использовать:

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