Re[10]: enum class and if expression
От: rg45 СССР  
Дата: 19.12.19 15:23
Оценка:
Здравствуйте, boomer, Вы писали:

R>>А кто, где и что говорил про неявность? Речь же шла об операторе if. А это явное преобразование.


B>Тогда, скажи пожалуйста, что обозначает в терминах перечислений значение, для которого вообще нет перечисления?


Что-то не понял перехода. Мы же это вроде обсудили уже? Что обозначет true в терминах чисел с плавающей точкой? Но там "это можно натянуть", а тут нельзя. Так это ты мне объясни, почему двойные стандарты.

B>А идея создавать объект, для которого вообще нет перечисления — еще более вредная, ИМХО.


Ну это понятно.

B>"Типизированные" перечисления (enum class : int) — это вообще какой-то нонсенс. Попытка новый механизм сделать совместимым со старым, который и хотели починить.


Ага, сначала были плохие плюсовики, теперь вот плохой C++. Так с этого нужно было начинать.
--
Отредактировано 19.12.2019 15:24 rg45 . Предыдущая версия .
Re[11]: enum class and if expression
От: B0FEE664  
Дата: 19.12.19 16:00
Оценка:
Здравствуйте, rg45, Вы писали:

R>Ага, сначала были плохие плюсовики, теперь вот плохой C++. Так с этого нужно было начинать.


Вообще-то enum в С++ всегда был и остаётся каким-то недоразумением. Сначала значения почему-то были видны наружу enum и засоряли глобальное пространство. При этом размер занимаетмой переменной почему-то зависит от значений enum'а. Потом сделали enum class, но не подумали об частой операции, когда нужно сконвертировать значение enum'а в другой тип. Вместо того, чтобы придумать удобный синтаксис разрешили инициализацию значениями не входящими в перечисление:
#include <iostream>
#include <cstdlib>
#include <utility>

enum class EE: unsigned
{
  asdf = 0, gkl = 1
};

int main() {
    // your code goes here
    
    EE x{9};
    
    return 0;
}

Причем разрешили только для {}, а для EE x(9); — нельзя, хотя по всей остальной логике должно быть ровно наоборот. И это при том, что таких простых операций, как, например, взять максимальное значение из перечисления не предусмотрено в языке.
И каждый день — без права на ошибку...
Re[12]: enum class and if expression
От: rg45 СССР  
Дата: 19.12.19 16:36
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>И это при том, что таких простых операций, как, например, взять максимальное значение из перечисления не предусмотрено в языке.


Я даже знаю почему. Сделай максимальное, придется делать и минимальное. А вслед за ними сумму, медиану и среднеквадратичное отклонение. Это ж как в той сказке "дай только лапку положить".
--
Отредактировано 19.12.2019 16:41 rg45 . Предыдущая версия .
Re[11]: enum class and if expression
От: boomer  
Дата: 19.12.19 16:41
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, boomer, Вы писали:


R>>>А кто, где и что говорил про неявность? Речь же шла об операторе if. А это явное преобразование.


B>>Тогда, скажи пожалуйста, что обозначает в терминах перечислений значение, для которого вообще нет перечисления?


R>Что-то не понял перехода. Мы же это вроде обсудили уже? Что обозначет true в терминах чисел с плавающей точкой? Но там "это можно натянуть", а тут нельзя. Так это ты мне объясни, почему двойные стандарты.


Не буду спорить. Тут тоже можно натянуть. Но согласись — что в обоих случаях такое использование нельзя назвать "по назначению".

B>>"Типизированные" перечисления (enum class : int) — это вообще какой-то нонсенс. Попытка новый механизм сделать совместимым со старым, который и хотели починить.


R>Ага, сначала были плохие плюсовики, теперь вот плохой C++. Так с этого нужно было начинать.


Плюсовики не плохие. Да и сам язык тоже не плох. Переусложнен без реальной необходимости просто.

Скатываюсь в оффтопик, но все же. Лучше бы вместо новых свистоперделок сделали нормальную работу с сетью в стандартной библиотеке.
Re[13]: enum class and if expression
От: boomer  
Дата: 19.12.19 16:42
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, B0FEE664, Вы писали:


BFE>>И это при том, что таких простых операций, как, например, взять максимальное значение из перечисления не предусмотрено в языке.


R>Я даже знаю почему. Сделай максимальное, придется делать и минимальное. А вслед за ними сумму, медиану и среднеквадратичное отклонение. Это ж как в той сказке "дай только лапку положить".


Опять же. Натягивание совы на глобус. Нет в перечислениях максимального и минимального. Есть просто набор значений. Вот чего не хватает — так это удобного конвертирования в строку и обратно.
Re[12]: enum class and if expression
От: rg45 СССР  
Дата: 19.12.19 16:44
Оценка:
Здравствуйте, boomer, Вы писали:

B>Скатываюсь в оффтопик, но все же. Лучше бы вместо новых свистоперделок сделали нормальную работу с сетью в стандартной библиотеке.


Да-да точно. И 3D графику тоже. Чтоб привыводе в поток красивые трехмерные буквы отображались.
--
Re[14]: enum class and if expression
От: rg45 СССР  
Дата: 19.12.19 16:46
Оценка:
Здравствуйте, boomer, Вы писали:

B>Опять же. Натягивание совы на глобус. Нет в перечислениях максимального и минимального...


Ну ты же видишь, тут сколько людей, столько и мнений. Слон животное большое.
--
Re[15]: enum class and if expression
От: boomer  
Дата: 19.12.19 16:49
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, boomer, Вы писали:


B>>Опять же. Натягивание совы на глобус. Нет в перечислениях максимального и минимального...


R>Ну ты же видишь, тут сколько людей, столько и мнений. Слон животное большое.


И это хорошо. Любую задачу можно сделать тысячей разных способов. И любой из них будет правильным.
Re[14]: enum class and if expression
От: B0FEE664  
Дата: 19.12.19 17:19
Оценка: :)
Здравствуйте, boomer, Вы писали:

B>Опять же. Натягивание совы на глобус. Нет в перечислениях максимального и минимального. Есть просто набор значений. Вот чего не хватает — так это удобного конвертирования в строку и обратно.


Это в enum class нет максимального, а вот в просто enum — есть.
И каждый день — без права на ошибку...
Re[13]: enum class and if expression
От: B0FEE664  
Дата: 19.12.19 17:46
Оценка:
Здравствуйте, rg45, Вы писали:

BFE>>И это при том, что таких простых операций, как, например, взять максимальное значение из перечисления не предусмотрено в языке.


R>Я даже знаю почему. Сделай максимальное, придется делать и минимальное. А вслед за ними сумму, медиану и среднеквадратичное отклонение. Это ж как в той сказке "дай только лапку положить".


rg45, ну разумеется интерфейс взятия максимального должен быть обобщённым, таким, чтобы программист сам мог выбрать максимальное, минимальное, медиану и среднеквадратичное отклонение. Всё, что для этого надо, это уметь перечислять значения перечисления в том или ином виде.

Что-нибудь в таком виде:
enum EE
{
  a, b, c, d
};

constexpr EE min = *std::min_element(std::begin<EE>(), std::end<EE>());


Или так:
for(auto en : EE)
  m = std::max(m, en);



Или может, просто сказать, что для всякого перечисления X, запись X... приводит к подстановке значений перечисления в порядке объявления:

EE... ==> EE::a, EE::b, EE::c, EE::d

тогда можно будет хоть с помощью Variadic templates, хоть иначе сделать почти всё, что нужно.

for(auto en : { EE... } )
  m = std::max(m, en);
И каждый день — без права на ошибку...
Re[15]: enum class and if expression
От: boomer  
Дата: 19.12.19 17:54
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Здравствуйте, boomer, Вы писали:


B>>Опять же. Натягивание совы на глобус. Нет в перечислениях максимального и минимального. Есть просто набор значений. Вот чего не хватает — так это удобного конвертирования в строку и обратно.


BFE>Это в enum class нет максимального, а вот в просто enum — есть.


Конечно. Я это и имел ввиду, что для перечислений нет такого понятия, как максимальное и минимальное. А то, что это было в "старых" enum — это недоразумение.
Re[14]: enum class and if expression
От: rg45 СССР  
Дата: 19.12.19 18:23
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>rg45, ну разумеется интерфейс взятия максимального должен быть обобщённым, таким, чтобы программист сам мог выбрать максимальное, минимальное, медиану и среднеквадратичное отклонение. Всё, что для этого надо, это уметь перечислять значения перечисления в том или ином виде.


BFE>Что-нибудь в таком виде:

BFE>
BFE>enum EE
BFE>{
BFE>  a, b, c, d
BFE>};

BFE>constexpr EE min = *std::min_element(std::begin<EE>(), std::end<EE>());
BFE>


В том или ином виде, это и так можно делать:

http://coliru.stacked-crooked.com/a/0581c82ed5e14b44

template<typename>
struct min_element;

template<typename T, T head, T...tail>
struct min_element<std::integer_sequence<T, head, tail...>> {
    static constexpr T value = std::min(head, min_element<std::integer_sequence<T, tail...>>::value);
};

template<typename T, T head>
struct min_element<std::integer_sequence<T, head>> {
    static constexpr T value = head;
};

enum EE {
    a, b, c, d
};
using EE_sequence = std::integer_sequence<EE, a, b, c, d>;

static_assert(a == min_element<EE_sequence>::value);
--
Re[15]: enum class and if expression
От: rg45 СССР  
Дата: 19.12.19 18:47
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Это в enum class нет максимального, а вот в просто enum — есть.



А я-то думал, ты шутишь. Почему нет-то? Вот, твой же пример, переделанный под scoped enum-ы:

http://coliru.stacked-crooked.com/a/38fc39024456e980

template<typename>
struct min_element;

template<typename T, T head, T...tail>
struct min_element<std::integer_sequence<T, head, tail...>> {
    static constexpr T value = std::min(head, min_element<std::integer_sequence<T, tail...>>::value);
};

template<typename T, T head>
struct min_element<std::integer_sequence<T, head>> {
    static constexpr T value = head;
};

enum class EE {
    a, b, c, d
};
using EE_sequence = std::integer_sequence<EE, EE::a, EE::b, EE::c, EE::d>;

static_assert(EE::a == min_element<EE_sequence>::value);
--
Re[16]: enum class and if expression
От: boomer  
Дата: 19.12.19 19:32
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, B0FEE664, Вы писали:


BFE>>Это в enum class нет максимального, а вот в просто enum — есть.


R>А я-то думал, ты шутишь. Почему нет-то? Вот, твой же пример, переделанный под scoped enum-ы:


R>http://coliru.stacked-crooked.com/a/38fc39024456e980


Это работает только потому, что scoped enum — по факту такой же enum, только завернутый в свой "неймспейс". Самый настоящий костыль.
Re[17]: enum class and if expression
От: rg45 СССР  
Дата: 19.12.19 19:36
Оценка:
Здравствуйте, boomer, Вы писали:

B>Это работает только потому, что scoped enum — по факту такой же enum, только завернутый в свой "неймспейс". Самый настоящий костыль.


Это работает потому, что таков язык C++, на сегодняшний день, нравится тебе это или нет.
--
Re[16]: enum class and if expression
От: B0FEE664  
Дата: 20.12.19 10:26
Оценка:
Здравствуйте, rg45, Вы писали:

R>
R>enum class EE {
R>    a, b, c, d
R>};
R>using EE_sequence = std::integer_sequence<EE, EE::a, EE::b, EE::c, EE::d>;

R>static_assert(EE::a == min_element<EE_sequence>::value);
R>


Проблема этого кода в том, что EE не зависит от EE_sequence, а потому добавление нового значения в EE приводит к необнаружимой ошибке:

enum class EE {
    a, b, c, d, e = -1
};
using EE_sequence = std::integer_sequence<EE, EE::a, EE::b, EE::c, EE::d>;

static_assert(EE::a == min_element<EE_sequence>::value);


А теперь представте, что EE используется для: конвертации в индекс массива функций обработки сообщений, конвертации в строку для лога и конвертацию в int для id сообщения — все эти последовательности придётся править руками при добавлении нового значения в EE.
И каждый день — без права на ошибку...
Отредактировано 20.12.2019 10:32 B0FEE664 . Предыдущая версия .
Re[17]: enum class and if expression
От: rg45 СССР  
Дата: 20.12.19 11:05
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>Проблема этого кода в том, что EE не зависит от EE_sequence, а потому добавление нового значения в EE приводит к необнаружимой ошибке:


Ну это понятно. Макросы не предлагать?

BFE>А теперь представте, что EE используется для: конвертации в индекс массива функций обработки сообщений, конвертации в строку для лога и конвертацию в int для id сообщения — все эти последовательности придётся править руками при добавлении нового значения в EE.


А вот тут не понял. Допустим, есть у тебя возможность перебора, о которой ты писал выше, как это поможет тебе избежать ручной правки массива функций и строк логов?
--
Re[18]: enum class and if expression
От: B0FEE664  
Дата: 20.12.19 11:25
Оценка:
Здравствуйте, rg45, Вы писали:

BFE>>Проблема этого кода в том, что EE не зависит от EE_sequence, а потому добавление нового значения в EE приводит к необнаружимой ошибке:

R>Ну это понятно. Макросы не предлагать?
А чего их предлагать? Я пользовался довольно долгое время boost enums. Они на макросах. Ну да, можно использовать, но ведь это макросы со всеми своими неудобствами. Например, однострочные комментарии при задании перечисления приводят к странным сообщениям об ошибке.

BFE>>А теперь представте, что EE используется для: конвертации в индекс массива функций обработки сообщений, конвертации в строку для лога и конвертацию в int для id сообщения — все эти последовательности придётся править руками при добавлении нового значения в EE.


R>А вот тут не понял. Допустим, есть у тебя возможность перебора, о которой ты писал выше, как это поможет тебе избежать ручной правки массива функций и строк логов?


Проблема не в том, что придётся править, а в том, что если не поправишь, то заметишь только в рантайме.
И каждый день — без права на ошибку...
Re[19]: enum class and if expression
От: rg45 СССР  
Дата: 20.12.19 11:37
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>А чего их предлагать? Я пользовался довольно долгое время boost enums. Они на макросах. Ну да, можно использовать, но ведь это макросы со всеми своими неудобствами. Например, однострочные комментарии при задании перечисления приводят к странным сообщениям об ошибке.


BFE>Проблема не в том, что придётся править, а в том, что если не поправишь, то заметишь только в рантайме.


Не, ну я согласен, что это было бы здорово иметь возможность перебора енумов. Но в таком случае, следовало бы поставить крест на преобразовани в энумы из underlying типов и использовании енумов для задания наборов флагов. Твою точку зрения по этому вопросу я помню, можешь не повторять

P.S. И не очень понятно, как быть с default/zero initialization.
--
Отредактировано 20.12.2019 11:49 rg45 . Предыдущая версия .
Re[19]: enum class and if expression
От: удусекшл  
Дата: 20.12.19 11:57
Оценка:
Здравствуйте, B0FEE664, Вы писали:


R>>А вот тут не понял. Допустим, есть у тебя возможность перебора, о которой ты писал выше, как это поможет тебе избежать ручной правки массива функций и строк логов?


BFE>Проблема не в том, что придётся править, а в том, что если не поправишь, то заметишь только в рантайме.



Или не заметишь
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.