Существует ли существующее имя для этого типа и функции? - PullRequest
24 голосов
/ 03 мая 2019

В компьютерных науках есть 2 трудные проблемы: аннулирование кэша, присвоение имен вещам и отдельные ошибки.

Это вторая проблема: присвоение имен вещам.

Яглядя, если этот метод или тип уже использовался где-то еще и имеет имя.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?Я ищу имя, которое хорошо известно в любом сообществе (даже не на языке C ++), даже глагол, который описывает «принятие значения времени выполнения и создание переключателя и набора значений времени компиляции в сгенерированном коде для выбора между"лучше, чем предложение.

Живой пример

Хороший ответ будет включать имя, цитаты / цитаты, описывающие, что означает это имя, примеры использования названной вещив другом контексте, и свидетельство того, что это имя эквивалентно или включает в себя вышеупомянутый тип / значение и функцию.

(Это может помочь найти имя, обобщение которого было бы enum вместоbool, который имеет фиксированное число известных состояний, и карту переключения / случая, которая преобразует значение времени выполнения в константу времени компиляции в каждом предложении case.)

Ответы [ 5 ]

9 голосов
/ 06 мая 2019

Я не знаю ни одного из существующих имен для этого шаблона, но если вы внимательно посмотрите на то, как 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_*.

#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";
}
4 голосов
/ 10 мая 2019

Генерация специализированной версии функции называется клонированием .(см. Процедура клонирования ).Термин клон используется для обозначения специализированной функции, генерируемой оптимизатором во время постоянного распространения (см. gcc doc ).

Набор специализированных функций, генерируемых std::visit можно назвать набор клонов .

Этот набор генерируется для всех комбинаций значения аргумента.Этот термин комбинация позволяет предположить, что множество возможных значений каждого аргумента конечно.

Таким образом, мы могли бы иметь длинное имя для набора клонов, например, набор клонов для всех комбинаций значений аргументов .Другим вариантом, более неясным, но более коротким, может быть комбинаторный набор клонов .

Как уже указывалось, действие выбора правильной функции для вызова в терминах аргумента может называться отправка .

Так что я бы предложил combinatiorial_clone_set_dispatch или dispatch_in_combinatorial_clone_set ...

2 голосов
/ 11 мая 2019

Поскольку я не знаю о подобной реализации, я просто пойду печатать по типу с байксовыми цветами.


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 здесь, так как мне нравятся рассуждения Клонка, но «статический» имеет контекстное значение в C ++, поэтому есть альтернативы (в порядке убывания важности):

  • boolean_visit
  • static_visit
  • constexpr_eval
  • constexpr_visit
1 голос
/ 13 мая 2019

Вы выпустили: (жирный шрифт)

Я ищу имя, которое хорошо известно в любом сообществе (даже не на языке C ++), дажеглагол, описывающий «, принимающий значение времени выполнения и создающий переключатель и набор значений времени компиляции в сгенерированном коде для выбора между » лучше, чем предложение.

Есть,но только если вы примете его из смежной области науки:

Национальный электротехнический кодекс США (NEC) определяет распределительный щит как «большую отдельную панель, раму или сборку панелей, на которыхсмонтированные на лицевой, задней или обеих сторонах выключатели, устройства защиты от перегрузки по току и другие защитные устройства, шины и обычно приборы ».Роль распределительного щита состоит в том, чтобы делить ток, подаваемый на распределительный щит, на меньшие токи для дальнейшего распределения и обеспечивать переключение, защиту по току и (возможно) измерение для этих различных токов.В целом, распределительные щиты могут распределять питание на трансформаторы, щитовые панели, контрольное оборудование и, в конечном счете, на отдельные нагрузки системы.

Принимая это мышление, вы бы просто назвали это переключатели .

Я также добавлю, что довольно необычно указывать (т. Е. repeat ) тип хранения или cv-квалификатор и т. Д. В именах типов / переменных - даже если они не видны вам напрямуюобычно оставлял бы это как неявное - если только это действительно не нужно подчеркивать.

0 голосов
/ 09 мая 2019

Может быть staticCastValue? Как и в случае, вы приводите динамическое (во время выполнения) значение к статическому значению. Может использоваться с шаблонами или перегрузками для разных типов.

Или, может быть, assertInmutable? Так как вы конвертируете изменчивый тип в неизменяемый.

Или, может быть, ExpressConstantly? Как и в вас выражают то же значение, но в постоянной форме. Форма, похожая на constexpr.

Дикий: staticBifurcate? Как и в случае с двумя вещами на выбор, существует раздвоение.

вильчатый глагол / Bʌɪfəkeɪt / 1. разделить на две ветви или вилки. "чуть ниже Каира раздваивается река"

Или, наконец, convertToConstExpr? Явно сказано, что значение будет преобразовано во что-то похожее или совместимое с constexpr.

...