All streams
Search
Write a publication
Pull to refresh
8
0
Send message
Вы процитировали мое сообщение и написали «Нет.», по-моему, это воспринимается довольно однозначно. И, кстати, об ограничениях решения там написано.

Вот, никаких строк нет.

Точно, компилятор оставлял те строки, т.к. мы view на них делали, если скопировать символы, то необходимость оставлять их пропадет.
Только я бы добавил еще одну функцию-прослойку, чтобы гарантировать constexpr контекст для вызова to_array.

template<auto v> constexpr auto get_name()
{
    constexpr auto name = to_array<v>();
    return name;
}
Нет.

Это все, конечно, так, но никак не противоречит тому, что я написал.

У этого решения есть еще два недостатка — первый это то, что в исполняемый файл попадают строки вида «constexpr auto f() [with auto v = Color::RED]» целиком, из-за чего бинарник разбухает. Из этого вытекает второй — имя дергается как subview от этой строки, и оно получается не нуль-терминировано.
Макросы, куда же без них. Распространенный вариант — оборачивать определение перечисления в макрос, а вот тут используют __PRETTY_FUNCTION__ и __FUNCSIG__, чтобы вытащить имена перечислений, и даже оборачивать ничего не надо.
Да, так будет правильнее, спасибо, подкорректировал.
У нас «прокачанные» перечисления с интроспекцией и прочими плюшками, так что не.
Нет, тут имеется в виду не С++ код, а логическое выражение, так что 1 это логическая единица. В этом случае '~' лучше поменять на '¬', да.
Так никто и не говорил об этом :) Эту функцию планировалось использовать в случае, если cond известно только в рантайме. Для приведенных выше строк предназначаются:
RaiseEnumFlag(state, flag);
ClearEnumFlag(state, flag);
Нет, я хотел сам получить выражение, поэтому нигде не искал. Эти варианты компактнее, спасибо, и вот почему: в статье я писал:
Напрямую с переменной cond толком не поработать: при преобразовании в арифметический тип в случае true мы получим только одну единицу в младшем разряде, а нам в идеале нужно получить единицы во всех разрядах.

Как оказалось, это не так — действительно, -cond дает нам именно то, что нужно: при cond = false это даст те же нули, однако при cond = true мы получим -1, то есть единицы во всех разрядах. Отталкиваясь от этого, видимо, можно и получить оба этих выражения.
Эти варианты еще хороши тем, что на всех компиляторах дают самый лучший результат (на MSVC asm аналогичен clang и gcc).
Clang 9.0 (последние два — варианты по ссылке):

gcc 9.2

Information

Rating
Does not participate
Registered
Activity