Здравствуйте, boomer, Вы писали:
R>>А кто, где и что говорил про неявность? Речь же шла об операторе if. А это явное преобразование.
B>Тогда, скажи пожалуйста, что обозначает в терминах перечислений значение, для которого вообще нет перечисления?
Что-то не понял перехода. Мы же это вроде обсудили уже? Что обозначет true в терминах чисел с плавающей точкой? Но там "это можно натянуть", а тут нельзя. Так это ты мне объясни, почему двойные стандарты.
B>А идея создавать объект, для которого вообще нет перечисления — еще более вредная, ИМХО.
Ну это понятно.
B>"Типизированные" перечисления (enum class : int) — это вообще какой-то нонсенс. Попытка новый механизм сделать совместимым со старым, который и хотели починить.
Ага, сначала были плохие плюсовики, теперь вот плохой C++. Так с этого нужно было начинать.
Здравствуйте, 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); — нельзя, хотя по всей остальной логике должно быть ровно наоборот. И это при том, что таких простых операций, как, например, взять максимальное значение из перечисления не предусмотрено в языке.
Здравствуйте, B0FEE664, Вы писали:
BFE>И это при том, что таких простых операций, как, например, взять максимальное значение из перечисления не предусмотрено в языке.
Я даже знаю почему. Сделай максимальное, придется делать и минимальное. А вслед за ними сумму, медиану и среднеквадратичное отклонение. Это ж как в той сказке "дай только лапку положить".
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, boomer, Вы писали:
R>>>А кто, где и что говорил про неявность? Речь же шла об операторе if. А это явное преобразование.
B>>Тогда, скажи пожалуйста, что обозначает в терминах перечислений значение, для которого вообще нет перечисления?
R>Что-то не понял перехода. Мы же это вроде обсудили уже? Что обозначет true в терминах чисел с плавающей точкой? Но там "это можно натянуть", а тут нельзя. Так это ты мне объясни, почему двойные стандарты.
Не буду спорить. Тут тоже можно натянуть. Но согласись — что в обоих случаях такое использование нельзя назвать "по назначению".
B>>"Типизированные" перечисления (enum class : int) — это вообще какой-то нонсенс. Попытка новый механизм сделать совместимым со старым, который и хотели починить.
R>Ага, сначала были плохие плюсовики, теперь вот плохой C++. Так с этого нужно было начинать.
Плюсовики не плохие. Да и сам язык тоже не плох. Переусложнен без реальной необходимости просто.
Скатываюсь в оффтопик, но все же. Лучше бы вместо новых свистоперделок сделали нормальную работу с сетью в стандартной библиотеке.
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, B0FEE664, Вы писали:
BFE>>И это при том, что таких простых операций, как, например, взять максимальное значение из перечисления не предусмотрено в языке.
R>Я даже знаю почему. Сделай максимальное, придется делать и минимальное. А вслед за ними сумму, медиану и среднеквадратичное отклонение. Это ж как в той сказке "дай только лапку положить".
Опять же. Натягивание совы на глобус. Нет в перечислениях максимального и минимального. Есть просто набор значений. Вот чего не хватает — так это удобного конвертирования в строку и обратно.
Здравствуйте, boomer, Вы писали:
B>Скатываюсь в оффтопик, но все же. Лучше бы вместо новых свистоперделок сделали нормальную работу с сетью в стандартной библиотеке.
Да-да точно. И 3D графику тоже. Чтоб привыводе в поток красивые трехмерные буквы отображались.
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, boomer, Вы писали:
B>>Опять же. Натягивание совы на глобус. Нет в перечислениях максимального и минимального...
R>Ну ты же видишь, тут сколько людей, столько и мнений. Слон животное большое.
И это хорошо. Любую задачу можно сделать тысячей разных способов. И любой из них будет правильным.
Здравствуйте, boomer, Вы писали:
B>Опять же. Натягивание совы на глобус. Нет в перечислениях максимального и минимального. Есть просто набор значений. Вот чего не хватает — так это удобного конвертирования в строку и обратно.
Это в enum class нет максимального, а вот в просто enum — есть.
Здравствуйте, 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, хоть иначе сделать почти всё, что нужно.
Здравствуйте, B0FEE664, Вы писали:
BFE>Здравствуйте, boomer, Вы писали:
B>>Опять же. Натягивание совы на глобус. Нет в перечислениях максимального и минимального. Есть просто набор значений. Вот чего не хватает — так это удобного конвертирования в строку и обратно.
BFE>Это в enum class нет максимального, а вот в просто enum — есть.
Конечно. Я это и имел ввиду, что для перечислений нет такого понятия, как максимальное и минимальное. А то, что это было в "старых" enum — это недоразумение.
Здравствуйте, 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>
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, B0FEE664, Вы писали:
BFE>>Это в enum class нет максимального, а вот в просто enum — есть.
R>А я-то думал, ты шутишь. Почему нет-то? Вот, твой же пример, переделанный под scoped enum-ы:
R>http://coliru.stacked-crooked.com/a/38fc39024456e980
Это работает только потому, что scoped enum — по факту такой же enum, только завернутый в свой "неймспейс". Самый настоящий костыль.
Здравствуйте, boomer, Вы писали:
B>Это работает только потому, что scoped enum — по факту такой же enum, только завернутый в свой "неймспейс". Самый настоящий костыль.
Это работает потому, что таков язык C++, на сегодняшний день, нравится тебе это или нет.
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.
Здравствуйте, B0FEE664, Вы писали:
BFE>Проблема этого кода в том, что EE не зависит от EE_sequence, а потому добавление нового значения в EE приводит к необнаружимой ошибке:
Ну это понятно. Макросы не предлагать?
BFE>А теперь представте, что EE используется для: конвертации в индекс массива функций обработки сообщений, конвертации в строку для лога и конвертацию в int для id сообщения — все эти последовательности придётся править руками при добавлении нового значения в EE.
А вот тут не понял. Допустим, есть у тебя возможность перебора, о которой ты писал выше, как это поможет тебе избежать ручной правки массива функций и строк логов?
Здравствуйте, rg45, Вы писали:
BFE>>Проблема этого кода в том, что EE не зависит от EE_sequence, а потому добавление нового значения в EE приводит к необнаружимой ошибке: R>Ну это понятно. Макросы не предлагать?
А чего их предлагать? Я пользовался довольно долгое время boost enums. Они на макросах. Ну да, можно использовать, но ведь это макросы со всеми своими неудобствами. Например, однострочные комментарии при задании перечисления приводят к странным сообщениям об ошибке.
BFE>>А теперь представте, что EE используется для: конвертации в индекс массива функций обработки сообщений, конвертации в строку для лога и конвертацию в int для id сообщения — все эти последовательности придётся править руками при добавлении нового значения в EE.
R>А вот тут не понял. Допустим, есть у тебя возможность перебора, о которой ты писал выше, как это поможет тебе избежать ручной правки массива функций и строк логов?
Проблема не в том, что придётся править, а в том, что если не поправишь, то заметишь только в рантайме.
Здравствуйте, B0FEE664, Вы писали:
BFE>А чего их предлагать? Я пользовался довольно долгое время boost enums. Они на макросах. Ну да, можно использовать, но ведь это макросы со всеми своими неудобствами. Например, однострочные комментарии при задании перечисления приводят к странным сообщениям об ошибке.
BFE>Проблема не в том, что придётся править, а в том, что если не поправишь, то заметишь только в рантайме.
Не, ну я согласен, что это было бы здорово иметь возможность перебора енумов. Но в таком случае, следовало бы поставить крест на преобразовани в энумы из underlying типов и использовании енумов для задания наборов флагов. Твою точку зрения по этому вопросу я помню, можешь не повторять
P.S. И не очень понятно, как быть с default/zero initialization.
R>>А вот тут не понял. Допустим, есть у тебя возможность перебора, о которой ты писал выше, как это поможет тебе избежать ручной правки массива функций и строк логов?
BFE>Проблема не в том, что придётся править, а в том, что если не поправишь, то заметишь только в рантайме.