Вы процитировали мое сообщение и написали «Нет.», по-моему, это воспринимается довольно однозначно. И, кстати, об ограничениях решения там написано.
Вот, никаких строк нет.
Точно, компилятор оставлял те строки, т.к. мы 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__, чтобы вытащить имена перечислений, и даже оборачивать ничего не надо.
Так никто и не говорил об этом :) Эту функцию планировалось использовать в случае, если cond известно только в рантайме. Для приведенных выше строк предназначаются:
Нет, я хотел сам получить выражение, поэтому нигде не искал. Эти варианты компактнее, спасибо, и вот почему: в статье я писал:
Напрямую с переменной cond толком не поработать: при преобразовании в арифметический тип в случае true мы получим только одну единицу в младшем разряде, а нам в идеале нужно получить единицы во всех разрядах.
Как оказалось, это не так — действительно, -cond дает нам именно то, что нужно: при cond = false это даст те же нули, однако при cond = true мы получим -1, то есть единицы во всех разрядах. Отталкиваясь от этого, видимо, можно и получить оба этих выражения.
Эти варианты еще хороши тем, что на всех компиляторах дают самый лучший результат (на MSVC asm аналогичен clang и gcc).
Clang 9.0 (последние два — варианты по ссылке):
gcc 9.2
Точно, компилятор оставлял те строки, т.к. мы view на них делали, если скопировать символы, то необходимость оставлять их пропадет.
Только я бы добавил еще одну функцию-прослойку, чтобы гарантировать constexpr контекст для вызова to_array.
Это все, конечно, так, но никак не противоречит тому, что я написал.
У этого решения есть еще два недостатка — первый это то, что в исполняемый файл попадают строки вида «constexpr auto f() [with auto v = Color::RED]» целиком, из-за чего бинарник разбухает. Из этого вытекает второй — имя дергается как subview от этой строки, и оно получается не нуль-терминировано.
cond
известно только в рантайме. Для приведенных выше строк предназначаются:Как оказалось, это не так — действительно,
-cond
дает нам именно то, что нужно: приcond = false
это даст те же нули, однако приcond = true
мы получим -1, то есть единицы во всех разрядах. Отталкиваясь от этого, видимо, можно и получить оба этих выражения.Эти варианты еще хороши тем, что на всех компиляторах дают самый лучший результат (на MSVC asm аналогичен clang и gcc).
Clang 9.0 (последние два — варианты по ссылке):
gcc 9.2