Существует ли существующее имя для этого типа и функции?
В компьютерных науках есть две серьезные проблемы: аннулирование кэша, присвоение имен и ошибки типа "один на один".
Это о второй проблеме: называть вещи.
Я смотрю, если этот метод или тип уже использовался где-то еще и имеет имя. dichotomy
- нормальное имя, но bools_at_compile_time
- ужасное.
using dichotomy_t = std::variant<std::false_type, std::true_type>;
// (or a struct that inherits from that, and overloads operator bool())
constexpr dichotomy_t dichotomy( bool b ) {
if (b) return std::true_type{};
return std::false_type{};
}
template<class F, class...Bools>
constexpr auto bools_at_compile_time( F&& f, Bools...bools ) {
static_assert( (std::is_same<Bools, bool>{} && ...) );
return std::visit( std::forward<F>(f), dichotomy(bools)... );
}
dichotomy_t
- это вариант между истиной и ложью. Его представление во время выполнения 0
или 1
.
Это позволяет:
auto foo( bool x, bool y ) { // <-- x and y are run-time bools here
auto func = [&](auto x, auto y) {
return some_template<x,y>(); // <-- x and y are compile-time bools here
};
return bools_at_compile_time( func, x, y ); // <-- converts runtime to compile time bools
}
Есть ли название для dichotomy_t
или более общей техники bools_at_compile_time
? Я ищу имя, которое хорошо известно в любом сообществе (даже не на языке С++), даже глагол, который описывает "принятие значения времени выполнения и создание переключателя и набора значений времени компиляции в сгенерированном коде для выбора между "лучше, чем предложение.
Живой пример
Хороший ответ будет включать имя, цитаты/цитаты, описывающие, что означает это имя, примеры этой именованной вещи, используемой в другом контексте, и свидетельство того, что это имя эквивалентно или включает вышеуказанный тип/значение и функцию.
(Это может помочь найти имя, обобщение которого было бы enum
вместо bool
, который имеет фиксированное число известных состояний, и картой switch/case, которая в каждом случае преобразует значение времени выполнения в константу времени компиляции пункт.)
Ответы
Ответ 1
Я не знаю ни одного из существующих имен для этого шаблона, но если вы внимательно посмотрите на то, как STL называет вещи, вы можете использовать имя достаточно близко, чтобы сделать ваш код явным.
Мне также понравилась идея dispatcher_t
от @Jarod42, я думаю, что она более общая, чем dichotomy_t
или n_chotomy_t
.
dichotomy()
можно назвать make_variant(b)
. Так как он вернет значение std::variant
логического значения, заданного в аргументе. Так же, как std::make_tuple
создает кортеж из нескольких аргументов.
Я бы предложил заменить bools_at_compile_time
на static_eval
. Во многом как static_assert
делает утверждение во время компиляции.
Не то чтобы eval
не был правильным прилагательным для вашего static_*
использования, вы можете легко адаптировать его static_*
.
#include <type_traits>
#include <variant>
#include <utility>
using dichotomy_t = std::variant<std::false_type, std::true_type>;
// (or a struct that inherits from that, and overloads operator bool())
constexpr dichotomy_t make_variant( bool b ) {
if (b) return std::true_type{};
return std::false_type{};
}
template<class F, class...Bools>
constexpr auto static_eval( F&& f, Bools...bools ) {
static_assert( (std::is_same<Bools, bool>{} && ...) );
return std::visit( std::forward<F>(f), make_variant(bools)... );
}
template<bool x, bool y>
auto some_template() {
return x || y;
}
auto foo( bool x, bool y ) { // <-- x and y are run-time bools here
auto func = [&](auto x, auto y) {
return some_template<x,y>(); // <-- x and y are compile-time bools here
};
return static_eval( func, x, y ); // <-- converts runtime to compile time bools
}
#include <iostream>
int main() {
std::cout << foo( true, true ) << "\n";
}
Ответ 2
Генерация специализированной версии функции называется клонированием. (см. Процедура клонирования). Термин клон используется для обозначения специализированной функции, генерируемой оптимизатором во время постоянного распространения (см. Gcc doc).
Набор специализированных функций, генерируемых std::visit
может быть назван набором клонов.
Этот набор генерируется для всех комбинаций значения аргумента. Эта комбинация терминов позволяет предположить, что множество возможных значений каждого аргумента конечно.
Таким образом, мы могли бы иметь длинное имя для набора клонов, такого как набор клонов для всех комбинаций значений аргументов. Другим вариантом, более неясным, но более коротким, может быть набор комбинаторных клонов.
Как уже указывалось, действие выбора правильной функции для вызова в терминах аргумента можно назвать диспетчеризацией.
Поэтому я хотел бы предложить combinatiorial_clone_set_dispatch
или dispatch_in_combinatorial_clone_set
...
Ответ 3
Поскольку я не знаю о подобной реализации, я просто буду печатать тип за шрифтом с байксовыми цветами.
using boolean_t = std::variant<std::false_type, std::true_type>;
Это довольно очевидно, так как это вариант, который может хранить один или другой из std::integral_constant
для true или false. Это что-то вроде bool
, но bool_t
может вызвать путаницу. Альтернативой является boolean_variant
, но это может быть слишком многословно.
constexpr boolean_t to_boolean_t( bool b ) {
if (b) return std::true_type{};
return std::false_type{};
}
Я начал с convert_bool
, но это слишком обобщенно. to_boolean_t
более выразителен. make_boolean_t
также возможен, так как в основном это фабричная функция boolean_t
. Примечание: ранее я выбирал to_constexpr_boolean
, но это излишне многословно.
template<class F, class...Bools>
constexpr auto static_eval( F&& f, Bools...bools ) {
static_assert( (std::is_same<Bools, bool>{} && ...) );
return std::visit( std::forward<F>(f), to_boolean_t(bools)... );
}
Я выбрал static_eval
здесь, так как мне нравятся рассуждения static_eval
, но "static" имеет контекстное значение в C++, поэтому есть альтернативы (в порядке убывания важности):
-
boolean_visit
-
static_visit
-
constexpr_eval
-
constexpr_visit
Ответ 4
Может быть staticCastValue? Как и в случае, вы приводите динамическое (во время выполнения) значение к статическому значению. Может использоваться с шаблонами или перегрузками для разных типов.
Или, может быть, assertInmutable? Так как вы конвертируете изменчивый тип в неизменяемый.
Или, возможно, выразить постоянно? Как и в вас выражают то же значение, но в постоянной форме. Форма, похожая на constexpr.
Дикий: staticBifurcate? Как и в случае с двумя вещами на выбор, таким образом, есть раздвоение.
раздвоенный глагол /ˈbʌɪfəkeɪt/1. разделите на две ветки или вилки. "чуть ниже Каира река раздваивается"
Или, наконец, convertToConstExpr? Явно говорится, что значение будет преобразовано во что-то похожее или совместимое с constexpr.
Ответ 5
Ваш вопрос был: (жирный мой)
Я ищу имя, которое хорошо известно в любом сообществе (даже не на языке С++), даже глагол, который описывает " принятие значения времени выполнения и создание переключателя и набора значений времени компиляции в сгенерированном коде для выбора между "лучше, чем предложение.
Есть, но только если вы примете это из смежной области науки:
Национальный электротехнический кодекс США (NEC) определяет распределительный щит как "большую одиночную панель, раму или сборку панелей, на которых установлены, на лицевой, задней или обеих сторонах, переключатели, устройства защиты от перегрузки по току и другие защитные устройства, шины, и обычно инструменты ". Роль распределительного щита состоит в том, чтобы делить ток, подаваемый на распределительный щит, на меньшие токи для дальнейшего распределения и обеспечивать переключение, защиту по току и (возможно) измерение для этих различных токов. В целом, распределительные щиты могут распределять мощность на трансформаторы, щитовые панели, контрольное оборудование и, в конечном счете, на отдельные нагрузки системы.
Принимая это мышление, вы бы просто назвали это переключателями.
Я также добавлю, что довольно необычно указывать (т.е. Повторять) тип хранения или cv-квалификатор и т.д. В именах типов/переменных - даже если они не видны напрямую, вы обычно оставляете это как неявное - если только это действительно не нужно быть подчеркнутым.
Ответ 6
Я ищу имя, которое хорошо известно в любом сообществе (даже не на языке С++), даже глагол, который описывает "принятие значения времени выполнения и создание переключателя и набора значений времени компиляции в сгенерированном коде для выбора между "
Отражение во время компиляции или метапрограммирование?
пример
Другой пример
Я также думаю, что ассоциативная карта - это вполне подходящий термин. Я мог бы быть далеко, но звучит похоже на этот контейнер ассоциативной карты времени компиляции/времени выполнения