Каков современный подход C ++ к структурам, содержащим символические константы?

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() только потому, что семафор теперь оранжевый.

Надеюсь, теперь это станет понятнее.

1

Решение

Что если бы вы хотели связать выполнение определенного метода с состоянием?

Я не уверен, что понимаю вашу точку зрения, но, возможно, вы имеете в виду что-то вроде этого:

ОПРЕДЕЛЕНИЕ

Вместо этого:

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();
1

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

Если semaphore имеет тип класса, тогда присваивание:

semaphore = 5;

автоматически вызовет функцию semaphore.operator=(int) если он существует. Таким образом, вы можете отслеживать любые «изменения» semaphore реализуя эту функцию (ничего не нужно менять, но это может нарушить принцип наименьшего удивления).

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector