0

だから私は変換する関数を考え出そうとしています;

std::pair<T,std::pair<U, V>>

データ型をstd::tuple;

std::tuple<T,U,V>

任意の数の混合型引数を使用して、一般的なケースで機能するはずです。ペアの形式は次のとおりです。

  • 「車」は常にタイプになります。
  • 「cdr」は常にstd::pair
    • 'cdr' が型自体になる最も内側のケースを除きます
      (ただしstd::pair、型は任意であるため、これはそれ自体である可能性があります)。

取得する引数の数と型は、可変個引数のテンプレート引数によって事前にわかっています。

現在の進行状況はやや低く、いくつかのことを試していますが、必要なコードはこれらの線に沿っているようです。

std::make_tuple(get<0>(pair), get<0>(get<1>(pair), get<0>(get<1>(get<1>(pair), ..., get<1>(pair)))));

しかし、私はこれを自動的に生成する方法を見つけることができないようです.私はSequence<int...>アプローチを試みました.通常のgetメソッドを使用して、これらを使用して複数回検索しますか?

4

1 に答える 1

2

単純な再帰はどうですか

#include <utility>
#include <tuple>

// 1. metafunction to concatenate a type and a tuple
template<typename T, typename U> struct tuple_prepend_type;

template<typename T, typename ...U>
struct tuple_prepend_type<T, std::tuple<U...>>
{
    using type = std::tuple<T, U...>;
};

// 2. is_pair type trait
template<typename>
struct is_pair : std::false_type {};
template<typename U, typename V>
struct is_pair<std::pair<U, V>> : public std::true_type {};

// 3. the converter itself
template<typename T, typename = void>
struct pairs_to_tuple {
    using type = std::tuple<typename T::first_type,
                            typename T::second_type>;
};

template<typename T>
struct pairs_to_tuple<T, typename std::enable_if<
                         is_pair<typename T::second_type>::value
                     >::type
         >
{
    using type = typename tuple_prepend_type<
                     typename T::first_type,
                     typename pairs_to_tuple<typename T::second_type>::type
                 >::type;
};

int main()
{
    std::pair<int, std::pair<double, std::pair<bool, char> > > p;
    static_assert(std::is_same<pairs_to_tuple<decltype(p)>::type,
                               std::tuple<int, double, bool, char>>::value, "")
}
于 2013-06-25T03:21:16.823 に答える