преобразовать массив вариантов в std :: tuple - PullRequest
0 голосов
/ 29 февраля 2012

Я работаю над оболочкой C ++ 11 для типа варианта, реализованного в C. Тип варианта поддерживает общие типы данных, такие как int, float, string, но также tuples . У меня есть конвертеры для основных типов формы ...

template<typename T>
T convert_to(const Variant &var);

... но я борюсь с преобразованием в std :: tuple.

Базовый C API может создать кортеж, возвращая массив Variants. Это выглядит примерно так:

int get_tuple(Variant var, Variant **argv, int *argc);

Теперь я понимаю, что могу вручную создавать шаблоны для каждого размера кортежа, но я ищу вариативное решение, которое может обрабатывать кортежи любого размера. Любые советы о том, как подойти к этому?

Кстати, я пытаюсь обернуть это API-интерфейс Erlang NIF.

1 Ответ

2 голосов
/ 29 февраля 2012

Поскольку вы используете C ++ 11 (и вы знаете тип кортежа из параметра шаблона), вы можете с радостью использовать шаблоны с переменным числом аргументов. Что-то вроде *

template <class ... Ts>
std::tuple<Ts...> convert_to(const Variant& v)
{
  Variant tmp_array[std::tuple_size<std::tuple<Ts...>>::value];
  get_tuple(v, tmp_array, sizeof(tmp_array)/sizeof(tmp_array[0]));
  std::tuple<Ts...> ret;
  array_to_tuple(ret, tmp_array);
  return ret;
}

, где array_to_tuple скопирует элементы один за другим:

template <class ... Ts>
struct array_to_tupler
{
  template <int I>
  static void do_it(std::tuple<Ts...> &t, Variant* vs)
  {
    std::get<I-1>(t) = convert_to<decltype(std::get<I-1>(t))>(vs[I-1]);
    do_it<I-1>(t, vs);
  }
  template <>
  static void do_it<0>(std::tuple<Ts...> &t, Variant* vs)
  {
  }
};

template <int N, class ... Ts>
void array_to_tuple(std::tuple<Ts...> &t, Variant (&vs)[N])
{
  array_to_tupler<Ts...>::do_it<N>(t, vs);
}

Надеюсь, это сработает ...

*) Обратите внимание, что такой convert_to будет нелегко вызвать. Я предлагаю выполнить специализацию для возвращаемых типов с помощью шаблонов классов, потому что вам нужна частичная специализация, которую не может иметь шаблон функции.

...