Здравствуйте, B0FEE664, Вы писали:
BFE>Да вы предлагаемый синтаксис видели? Он вам такой зачем?
а что в нём такого плохого?
Вот например рядом обсуждают задачу получения минимального значения из enum
template <typename E>
requires std::is_enum_v<E>
constexpr auto enum_min()
{
auto minVal = std::numeric_limits<std::underlying_type_t<E>>::max();
template for (constexpr auto e : std::meta::enumerators_of(^E)) {
const auto v = std::to_underlying([:e:]);
if (v < minVal)
minVal = v;
}
return minVal;
}
всяко лучше, чем костыли от magic_enum
Здравствуйте, sergii.p, Вы писали:
BFE>>Да вы предлагаемый синтаксис видели? Он вам такой зачем?
SP>а что в нём такого плохого?
В примере ниже отчётливо видны проблемы синтаксиса.
Свойства объекта записываются в C++ как? Через модификатор доступа, т.е. через
. или
->
a.size() — размер;
p->data() — данные.
Комитетчики добавили это для метаданных? Нет, они пишут сначала преобразование всего имени в метаобъект, а потом используют сишный (!) доступ к его свойствам:
std::meta::enumerators_of(^E)
Они просто издеваются над языком.
Эта запись должна выглядеть так:
E.entities
Далее, вот этот синтаксис
[:e:] не нужен. То, что
е — это метаобъект и так известно. Поэтому
e.name должно давать имя, а
e.value — значение.
Далее,
template for не нужен. Код относящийся к рефлексии не может выполняться в рантайме, так что
template тут лишний, поэтому, кстати,
enum_min() должна быть
consteval, а не
constexpr.
В целом я бы записал этот пример так:
template <typename E>
requires std::is_enum_v<E>
consteval E.underlying_type enum_min()
{
auto minVal = E.underlying_type.max_value;
for(auto e : E.entities)
{
const auto v = e.value;
if (v < minVal)
minVal = v;
}
return minVal;
}
— всё просто и понятно. Всё , что надо сделать, это продумать названия свойств, которые есть у метаобъектов. Причём эти свойства можно вводить постепенно, добавляя от версии к версии. Для начала — просто для чтения. Это уже решило бы 80% задач.
Вместо эволюционного пути развития комитетчики задумали революцию и изобретают метаязык который год. Результат их работы станет такая монструозная химера, которую невозможно будет нормально использовать. Надеюсь они потому её и не выпускают, что понимают, какая ерунда получается. Если они продолжат в том же духе, то эти нововведения постигнет та же судьба, что и SGML.
| | Скрытый текст |
| | SP>Вот например рядом обсуждают задачу получения минимального значения из enum
SP>SP>template <typename E>
SP> requires std::is_enum_v<E>
SP>constexpr auto enum_min()
SP>{
SP> auto minVal = std::numeric_limits<std::underlying_type_t<E>>::max();
SP> template for (constexpr auto e : std::meta::enumerators_of(^E)) {
SP> const auto v = std::to_underlying([:e:]);
SP> if (v < minVal)
SP> minVal = v;
SP> }
SP> return minVal;
SP>}
SP>
SP>всяко лучше, чем костыли от magic_enum |
| | |
Что же касается обсуждения рядом, то я могу лишь повториться: набор констант и перечисление — это два различных "метатипа". У нормального перечисления вообще нет значений. Если вам нужны значения, значит вам нужен набор констант, а не перечисление.