0

C で実装されたバリアント型の C++11 ラッパーに取り組んでいます。バリアント型は、 int 、 float 、 string などの一般的なデータ型だけでなくtuplesもサポートしています。フォームの基本型のコンバーターがあります...

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

...しかし、std::tuple への変換に苦労しています。

基礎となる C API は、バリアントの配列を返すことによってタプルを分割できます。次のようになります。

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

タプルのサイズごとに手動でテンプレートを作成できることを認識しましたが、任意のサイズのタプルを処理できる可変引数ソリューションを探しています。これにアプローチする方法に関するヒントはありますか?

ところで、私が実際にラップしようとしているのは、Erlang NIF API です。

4

1 に答える 1

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;
}

wherearray_to_tupleは要素を 1 つずつコピーします。

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ものは簡単に呼び出せないことに注意してください。関数テンプレートにはできない部分的な特殊化が必要なため、クラステンプレートを使用して戻り値の型を特殊化することをお勧めします。

于 2012-02-29T19:05:25.120 に答える