Войти
ПрограммированиеФорумОбщее

С++: рукопожатно ли использовать конверсию в enum из значений, изначально в него не входящих? (2 стр)

Страницы: 1 2
#15
23:47, 26 окт. 2018

Sbtrn. Devil
> // типа некошерно и антиинтуитивно
> // типа по-пацански
понты - это понятно, но меня технический аспект интересует.

на бинарном уровне эти штуки должны быть одинаковы (?), а вот с точки зрения языка это одно и то же или нет?


#16
0:29, 27 окт. 2018

skalogryz
http://www.stroustrup.com/C++11FAQ.html#enum

#17
0:43, 27 окт. 2018

Благодарю! отвечено!

#18
3:46, 27 окт. 2018

Sbtrn. Devil
> Угу. А теперь в ProperyId запихнуть также PIUserA и PIUserB, пжалста.
https://rextester.com/GGIM71534

#19
13:49, 27 окт. 2018

Delfigamer

namespace mylib
{
    enum class PropertyId: int32_t;
   
    constexpr auto PIBuiltinA = static_cast<PropertyId>(0);

Что-то в данном случае enum class кажется излишним. С обычным енумом можно провернуть то же самое.
#20
(Правка: 15:58) 15:57, 27 окт. 2018

Sbtrn. Devil
С обычным енумом нельзя запретить бредятину вида

int iabs(int x)
{
    return x<0 ? -x : x;
}
int main()
{
    std::cout << iabs(mylib::PIBuiltinB) << "\n";
    std::cout << (user::PIUserB - mylib::PIBuiltinB) * 200 << "\n";
}
Но если ты динамический клоун, то конечно, это всё излишне и лучше всё текстовыми строками передавать.
#21
21:05, 27 окт. 2018

Кстати, а почему такая битва за switch? каскад if-ов не устраивает по производительности? А вообще по поводу предсказания ветвлений и пенальти за неправильное предсказание - делалась ли оценка, хуже или лучше работает предсказание для косвенного перехода по сравнению с предсказанием ветвления?

Если глядеть в сторону if-ов, для значений енума на основе класса можно реализовать отношения больше-меньше, и реализовать древовидный if с логарифмической зависимостью глубины от количества значений (а также упростить задачу построения дерева if-ов, задав в классе помимо основных значений еще и значения половинного деления).

А может быть и еще хитрее можно придумать, если значения енума на основе класса естественным образом будут организованы не в линейную последовательность, а в бинарное дерево (и юзерские расширения делать именно к дереву). Только пока нет мыслей, как это могло бы быть организовано...

#22
(Правка: 1:27) 1:27, 28 окт. 2018

Dmitry_Milk
> Кстати, а почему такая битва за switch? каскад if-ов не устраивает по
> производительности?
switch - это намерение, а каскад if - это одна из реализаций.

Dmitry_Milk
> Если глядеть в сторону if-ов, для значений енума на основе класса можно
> реализовать отношения больше-меньше, и реализовать древовидный if с
> логарифмической зависимостью глубины от количества значений
А если глядеть в сторону switch, то компилятор сделает всё то же самое автоматически, и при этом тебе не придётся превращать код в мокрые опилки.

#23
2:38, 28 окт. 2018

Sbtrn. Devil
> С++: рукопожатно ли использовать конверсию в enum из значений, изначально в него не входящих?
можно. и ты её обязательно улучшишь

#24
(Правка: 9:57) 9:49, 28 окт. 2018

Sbtrn. Devil
> типа некошерно и антиинтуитивно

// код c++ курильщика (для чистого си — это ок)
MySuperSpecificEnumName const var = MSSENOption1;
                                    ^^^^^ Обожаю запоминать аббревиатуры.

// код c++ нормального человека
MySuperSpecificEnumName const var = MySuperSpecificEnumName::Option1;
                                    ^^^^^^^^^^^^^^^^^^^^^^^ Не сэкономил на символах, зато все ясно.

skalogryz
> писать "enum" лучше, ибо ближе к Си
Так пиши на си, причем тут плюсы?

Мб еще указателями на функции пользоваться вместо std::function? Или сишными статичными массивами вместо std::array? Тоже ведь ближе к си.

#25
12:42, 28 окт. 2018

Delfigamer
> switch - это намерение, а каскад if - это одна из реализаций.

Тогда бы исходного вопроса не было. В switch енумы на основе классов засунуть невозможно, а в if - сколько душе угодно. Если данный свитч не является узким местом по производительности, то конструкция

if()
{
}
else if()
{
}
else if()
{
}
...
else
{
}

читается ничуть не хуже switch/case (а может быть даже и лучше)

#26
13:52, 28 окт. 2018
mahrizh
> код c++ нормального человека
нормальный человек хотя бы на первой части символы сэкономит - const auto var = MySuperSpecificEnumName::Option1;

Dmitry_Milk
switch безопаснее - с ифами легко опечататься и два раза одно значение проверить или одно пропустить.
#27
17:47, 28 окт. 2018

http://aantron.github.io/better-enums/

Страницы: 1 2
ПрограммированиеФорумОбщее