Только мои 2 цента:
std::vector<bool>::reference
является typedef для struct _Bit_reference
, который определяется как
typedef unsigned long _Bit_type;
struct _Bit_reference
{
_Bit_type * _M_p;
_Bit_type _M_mask;
// constructors, operators, etc...
operator bool() const
{ return !!(*_M_p & _M_mask); }
};
. Меняя функцию, подобную этой, она работает (ну, компилирует, по крайней мере, не проверял):
template< typename T >
void callIfToggled( bool v1, std::vector<bool>::reference v2, T & t )
{
bool b = v2;
if ( v1 != b )
{
v2 = v1;
t.foo();
}
}
EDIT: я изменил условие от (v1! = v2), что не было хорошей идеей, (v1! = b).
Подход, основанный на итераторах, просто отлично. Есть несколько небольших изменений, которые могут подчеркнуть тот факт, что вы считаете:
sum(1 if meets_condition(x) else 0 for x in my_list)
# or
sum(1 for x in my_list if meets_condition(x))
И, как всегда, если намерение не очевидно из кода, инкапсулируйте его в функцию с описательно названным именем:
def count_matching(condition, seq):
"""Returns the amount of items in seq that return true from condition"""
return sum(1 for item in seq if condition(item))
count_matching(meets_condition, my_list)
Первый
sum(meets_condition(x) for x in my_list)
кажется мне отлично читаемым и питоническим.
Если вы предпочитаете второй подход, я бы выбрал
len(filter(meets_condition, my_list))
Еще один способ:
map(meets_condition, my_list).count(True)