Применяйте функцию времени выполнения только тогда, когда входные данные времени выполнения равны именованному члену в наборе типов - PullRequest
0 голосов
/ 12 января 2020

У меня есть кортеж типа hana

auto mytypes =\
  bh::make_tuple(bh::type_c<T1>,
         bh::type_c<T2>,
         bh::type_c<T3>,
         bh::type_c<T4>);

Каждый из T - это простые структуры C ++. Все они имеют член

static const std::string mtype

Моя функция в настоящее время

process(const std::string& intype)
{
  if (intype==T1::mtype)
     get<T1>();
  else if (intype==T2::mtype)
     get<T2>();
   ...
}

, и у меня есть шаблонная функция

template <typename T> T* get();

Как запустить функцию get() только для типа T, где T::mtype == intype? Цель состоит в том, чтобы определить, какой тип Ti выбрать из значения времени выполнения intype. Вместо того, чтобы иметь явные операторы if для каждого возможного типа, я хотел бы сгенерировать это поведение с помощью чего-то вроде hana :: for_each, но применять только тогда, когда тип соответствует

1 Ответ

0 голосов
/ 12 января 2020

С помощью hana вы можете получить доступ к типу type<T>, используя унарный оператор +:

auto x = type_c<T>;
using TAlias = typename decltype(+x)::type; // = T

. Вы можете использовать его для доступа к свойству stati c ::mtype внутри вашего hana::for_each l oop:

void process(const std::string& intype) {
    bh::for_each(mytypes, [&intype](auto&& t) {
        using T = typename decltype(+t)::type;
        if (T::mtype == intype) {
            T* value = get<T>();
            /* do something with value... */
        }
    });
}

Демонстрация: https://godbolt.org/z/7zovnY

...