Как оценить объект непосредственно в логическом контексте?

Я хочу оценить экземпляр некоторого класса в логическом контексте. Или, чтобы быть более понятным, я хочу определить, как объект реагирует, если он используется непосредственно в логическом контексте.
Вот пример:

class Foo
{
int state;
Foo(): state(1) {}
bool checkState()
{
return (state >= 0);
}
void doWork()
{
/*blah with state*/
}
};

int main()
{
Foo obj;
//while(obj.checkState())  //this works perfectly, and thats what i indent to do!
while(obj)               //this is what want to write
obj.doWork();
return 0;
}

Хорошо, просто приятно иметь :-), но возможно ли это вообще? Если да, то как?

Спасибо!

4

Решение

Используйте явный оператор преобразования для bool:

explicit operator bool() const { return (state >= 0); }

Это делает именно так что вы хотите: определить, что происходит, когда объект оценивается в логическом контексте.

Если у вас есть старый компилятор, вы не можете использовать explicitи это плохо, потому что operator bool() (без explicit) может в конечном итоге использоваться не в булевых контекстах. В этом случае используйте безопасная идиома вместо.

11

Другие решения

Ты можешь использовать operator bool():

explicit operator bool() const
{
return (state >=0) ;
}

Как указано, вы хотите использовать explicit чтобы это не использовалось в целочисленном контексте. Также главная должна вернуть int.

1