将变体数组转换为std :: tuple

时间:2012-02-29 18:47:05

标签: c++ templates c++11 tuples variadic

我正在为C实现的变体类型开发C ++ 11包装器。变体类型支持常见的数据类型,如int,float,string,还有元组。我有转换器用于表单的基本类型...

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

...但我正在努力转换为std :: tuple。

底层的C API可以通过返回Variants数组来打破元组。它看起来像这样:

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

现在我认识到我可以手动为每个大小的元组创建模板,但我正在寻找一种可以处理任何大小的元组的可变参数解决方案。关于如何处理这个的任何提示?

BTW,我试图包装的实际内容是Erlang NIF API。

1 个答案:

答案 0 :(得分:2)

由于您正在使用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将无法轻松调用。我建议使用类模板对返回类型进行专门化,因为你需要部分特化,哪个函数模板不能有。