Аналог scoped enum до C++11
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.06.18 11:45
Оценка:
Как бы поизящнее прикрутить к enum ограничение области видимости в версиях до C++11?

Я пока не придумал ничего лучшего, чем заворачивать enum в одноименный namespace, но тогда на имя типа приходится ссылаться конструкцией вида EnumType::EnumType, что выглядит как-то коряво.
enum scoped c++03
Re: Аналог scoped enum до C++11
От: reversecode google
Дата: 03.06.18 12:18
Оценка:
смотря чем ограничена эта область
кроме неймспейса еще можно структурой или классом оборачивать
и виден такой енум будет соответственно только в пределах класса или структуры

других путей нет
Re[2]: Аналог scoped enum до C++11
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.06.18 13:40
Оценка:
Здравствуйте, reversecode, Вы писали:

R>кроме неймспейса еще можно структурой или классом оборачивать

R>и виден такой енум будет соответственно только в пределах класса или структуры

Это понятно. Тут основная проблема в том, чтобы определить константы с простыми, не уникальными именами вроде Day, Out или Upper. В scoped enum доступ к ним возможен только через квалификатор имени типа, и все выглядит очень изящно. Хочется сделать нечто похожее в C++03, но не слишком коряво.
Re[3]: Аналог scoped enum до C++11
От: reversecode google
Дата: 03.06.18 14:13
Оценка:
для того их и улучшали в С++11 что бы поубирать эти ограничения

ну пусть будут
e_day, e_month e_upper
или
eDay, eMoth eUpper и никогда не было проблем
или
enum SomeStatusValue { ssValue1, ssValue2, ssValue3 };
поизучайте всякие code style
Re[4]: Аналог scoped enum до C++11
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.06.18 14:34
Оценка:
Здравствуйте, reversecode, Вы писали:

R>ну пусть будут

R>e_day, e_month e_upper

Понятно, что префиксов можно нагородить любых. Хочется именно возможности доступа к членам исключительно через квалификаторы типа.
Re[5]: Аналог scoped enum до C++11
От: reversecode google
Дата: 03.06.18 15:07
Оценка:
ну тогда с костылями дефайнов через буст
https://www.boost.org/doc/libs/1_60_0/libs/core/doc/html/core/scoped_enum.html
Re: Аналог scoped enum до C++11
От: kov_serg Россия  
Дата: 03.06.18 15:17
Оценка: +1 -1
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Как бы поизящнее прикрутить к enum ограничение области видимости в версиях до C++11?


ЕМ>Я пока не придумал ничего лучшего, чем заворачивать enum в одноименный namespace, но тогда на имя типа приходится ссылаться конструкцией вида EnumType::EnumType, что выглядит как-то коряво.

А что именно коряво?
struct Bit { enum { B0=1, B1=2, B2=4, B3=8 }; };
//
int x = Bit::B0 | Bit::B2;
Re[2]: Аналог scoped enum до C++11
От: reversecode google
Дата: 03.06.18 15:25
Оценка: +1
он хочет наверное
Bit x = Bit::B0 | Bit::B2;
Re[3]: Аналог scoped enum до C++11
От: kov_serg Россия  
Дата: 03.06.18 15:28
Оценка: -1
Здравствуйте, reversecode, Вы писали:


R>он хочет наверное

R>Bit x = Bit::B0 | Bit::B2;
дык нет проблем
struct A : Bit { 
  static int a() { return B0|B2; } 
  enum { B02=B0|B2 };
};
int x=A::a();
int y=A::B02;
Отредактировано 03.06.2018 15:31 kov_serg . Предыдущая версия .
Re[3]: Аналог scoped enum до C++11
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.06.18 16:18
Оценка:
Здравствуйте, reversecode, Вы писали:

R>он хочет наверное

R>Bit x = Bit::B0 | Bit::B2;

Именно.
Re[4]: Аналог scoped enum до C++11
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.06.18 16:19
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>
_>struct A : Bit { 
_>  static int a() { return B0|B2; } 
_>  enum { B02=B0|B2 };
_>};
_>int x=A::a();
_>int y=A::B02;
_>


Это гораздо более коряво, чем двойная квалификация через имена namespace и enum.
Re[4]: Аналог scoped enum до C++11
От: kov_serg Россия  
Дата: 03.06.18 17:00
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

R>>он хочет наверное

R>>Bit x = Bit::B0 | Bit::B2;

ЕМ>Именно.


Зачем?
Re[5]: Аналог scoped enum до C++11
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 03.06.18 17:04
Оценка:
Здравствуйте, kov_serg, Вы писали:

R>>>Bit x = Bit::B0 | Bit::B2;


ЕМ>>Именно.


_>Зачем?


Затем, чтоб компилятор отслеживал тип переменной, и обламывал ошибочные попытки присвоить ей произвольное числовое значение. Я б с удовольствием запретил и преобразование enum в int по умолчанию, оставив только явное, но компиляторы такого не умеют.
Re[6]: Аналог scoped enum до C++11
От: okman Беларусь https://searchinform.ru/
Дата: 03.06.18 17:25
Оценка: +2
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Затем, чтоб компилятор отслеживал тип переменной, и обламывал ошибочные попытки присвоить ей произвольное числовое значение. Я б с удовольствием запретил и преобразование enum в int по умолчанию, оставив только явное, но компиляторы такого не умеют.


Я использую примерно такой подход:
struct Color
{
    enum t
    {
        Red,
        Green,
        Blue
    };
};


При указании типа следует использовать Color::t, константы указываются как Color::Red, Color::Green и Color::Blue.
При попытке присвоить Color::t "что-нибудь" компилятор обычно ругается.
Re[6]: Аналог scoped enum до C++11
От: kov_serg Россия  
Дата: 03.06.18 18:06
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, kov_serg, Вы писали:


R>>>>Bit x = Bit::B0 | Bit::B2;


ЕМ>>>Именно.


_>>Зачем?


ЕМ>Затем, чтоб компилятор отслеживал тип переменной, и обламывал ошибочные попытки присвоить ей произвольное числовое значение. Я б с удовольствием запретил и преобразование enum в int по умолчанию, оставив только явное, но компиляторы такого не умеют.


Вам не кажется что это доведение до абсурда?
Може вы еще и такие типы хотите PositiveDouble, RangeDouble, MultiRangeDouble, DoubleWithAcceptedValues
и еще такие DoubleMeter, FloatTime, LongDoubleMass ...
И потом трахаетесь с их преобразованиями?
Может лучше не плодить сущности, пораждаю лишнюю энтропию, а использовать по максимуму имеющиеся?
Re: Аналог scoped enum до C++11
От: flаt  
Дата: 03.06.18 18:16
Оценка: +1
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Как бы поизящнее прикрутить к enum ограничение области видимости в версиях до C++11?


https://rsdn.org/forum/cpp/2646987
Автор: remark
Дата: 06.09.07

http://rsdn.org/forum/cpp/5877840
Автор: Vain
Дата: 03.12.14


Не подойдёт?
Re[7]: Аналог scoped enum до C++11
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 04.06.18 01:36
Оценка:
Здравствуйте, okman, Вы писали:

O>
O>struct Color
O>    enum t
O>


О, спасибо. Я такое тоже использую с namespace, когда имя типа можно естественным образом разделить на названия двух независимых сущностей, а вот когда разделить нельзя — не придумал ничего лучше, чем давать одинаковые имена и тому, и другому. Вроде бы очевидная и элементарная идея, а вот не пришла в голову.
Re[7]: Аналог scoped enum до C++11
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 04.06.18 01:46
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Вам не кажется что это доведение до абсурда?


Никоим образом. Если в языке есть идея строгой типизации — ее нужно использовать везде, кроме исключительных случаев.

_>Може вы еще и такие типы хотите PositiveDouble, RangeDouble, MultiRangeDouble, DoubleWithAcceptedValues

_>и еще такие DoubleMeter, FloatTime, LongDoubleMass ...

Не хочу. По той простой причине, что тип double предназначен для вычислений, и диапазон его значений по определению не имеет разрывов, кроме пары неопределенностей. А тип enum, наоборот, для вычислений по определению не предназначен, и его значения не обязаны быть смежными. По сути, это такой примитивный аналог множества с постоянной мощностью 1, из которого можно принудительно сделать множества мощностью до 32-64.

_>Может лучше не плодить сущности, пораждаю лишнюю энтропию, а использовать по максимуму имеющиеся?


Имеющиеся сущности лучше использовать, когда они добавляют читабельности, безопасности и эффективности. Я бы хотел иметь в языке еще несколько возможностей для ограничения свободы компилятора по неявному преобразованию типов, а также пару десятков дополнительных предупреждений.
Отредактировано 04.06.2018 2:12 Евгений Музыченко . Предыдущая версия .
Re[2]: Аналог scoped enum до C++11
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 04.06.18 02:12
Оценка:
Здравствуйте, flаt, Вы писали:

F>https://rsdn.org/forum/cpp/2646987
Автор: remark
Дата: 06.09.07

F>http://rsdn.org/forum/cpp/5877840
Автор: Vain
Дата: 03.12.14


Изящные решения. Но в критичных по времени конструкциях нужно использовать с осторожностью — на элементарные с виду конструкции компилятор в отладочном режиме нагенерит много кода, да еще с вызовами, скоростью может резко упасть.
Re[8]: Аналог scoped enum до C++11
От: kov_serg Россия  
Дата: 04.06.18 06:25
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Не хочу. По той простой причине, что тип double предназначен для вычислений, и диапазон его значений по определению не имеет разрывов, кроме пары неопределенностей. А тип enum, наоборот, для вычислений по определению не предназначен, и его значения не обязаны быть смежными. По сути, это такой примитивный аналог множества с постоянной мощностью 1, из которого можно принудительно сделать множества мощностью до 32-64.

Вот например функция sqrt ждёт положительные значения, asin значение из диапазона [-1..1]. Так что вполне можно использовать типы с ограничениями. Более того иногда хочется проверки на переполнения например у целых чисел.

ЕМ>Имеющиеся сущности лучше использовать, когда они добавляют читабельности, безопасности и эффективности. Я бы хотел иметь в языке еще несколько возможностей для ограничения свободы компилятора по неявному преобразованию типов, а также пару десятков дополнительных предупреждений.

Всё же вы видимо хотите ограничивать не компилятор, а программистов которые будут работать с этим кодом.
Вам стоит использовать не C++, он явно преследует иные цели.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.