enum bool
{
FALSE = 0,
TRUE = 1
};
Мне интересно, как перевести это в современный подход C ++ и есть ли подходящий контейнер для этого; я знаю что enum
не очень ценятся, но я не могу думать о реальной альтернативе в мире C ++.
Что если бы вы хотели связать выполнение определенного метода с состоянием?
Хорошо, это та часть, где я буду более многословен.
Я хотел бы подчеркнуть тот факт, что я спрашиваю о структурных символических константах, а не о TRUE и FALSE, я не настолько «нуждаюсь».
Предположим, что у меня есть структура, которая может представлять несколько состояний со своими константами
enum semaphore
{
GREEN = 0,
ORANGE = 1,
RED = 2
};
это код на C, теперь мой вопрос о том, как сделать то же самое в C ++, если есть лучший способ.
Мой вопрос продолжается, когда я спрашиваю о возможности сделать что-то вроде автоматического запуска, когда произойдет изменение состояния, например:
int main
{
...
semaphore = 1;
...
}
и без каких-либо дополнительных заявлений это должно вызвать method()
только потому, что семафор теперь оранжевый.
Надеюсь, теперь это станет понятнее.
Что если бы вы хотели связать выполнение определенного метода с состоянием?
Я не уверен, что понимаю вашу точку зрения, но, возможно, вы имеете в виду что-то вроде этого:
ОПРЕДЕЛЕНИЕ
Вместо этого:
enum BOOL
{
FALSE = 0,
TRUE = 1
};
void executeOnlyWithTrue(BOOL b)
{
if (b == TRUE)
{
RunParticularMethodOnlyNeededForTrueState();
}
}
Ты делаешь это:
class BOOL
{
public:
virtual void executeOnlyWithTrue() const {/*default does nothing*/}
};
class FALSE : public BOOL
{ //no override, so using default executeOnlyWithTrue (BOOL's)
};
class TRUE : public BOOL
{
public:
virtual void executeOnlyWithTrue() const
{
RunParticularMethodOnlyNeededForTrueState();
}
};
ИСПОЛЬЗОВАНИЕ
Вместо этого:
const BOOL b = TRUE;
...
executeOnlyWithTrue(b)
...
Ты делаешь это:
const BOOL& b = TRUE();
b.executeOnlyWithTrue();
Если semaphore
имеет тип класса, тогда присваивание:
semaphore = 5;
автоматически вызовет функцию semaphore.operator=(int)
если он существует. Таким образом, вы можете отслеживать любые «изменения» semaphore
реализуя эту функцию (ничего не нужно менять, но это может нарушить принцип наименьшего удивления).