可変引数テンプレートでtranspose

元ネタ:可変引数テンプレートでzip


transposeは行と列を変換するメタ関数です。

template <class ...Sequence>
struct transpose;

template <class ...Elements1, class ...Elements2>
struct transpose<std::tuple<Elements1...>, std::tuple<Elements2...>> {
    typedef std::tuple<std::tuple<Elements1, Elements2>...> type;
};

template <class ...Elements1, class ...Elements2, class ...Elements3>
struct transpose<std::tuple<Elements1...>, std::tuple<Elements2...>, std::tuple<Elements3...>> {
    typedef std::tuple<std::tuple<Elements1, Elements2, Elements3>...> type;
};

...

以下のように使用した場合には

typedef
    transpose<
        tuple<int,    long,        int&>,
        tuple<double, float,       double&>,
        tuple<char,   const char*, char&>
    >::type
type;

typeの型は以下のようになります。

tuple<
  tuple<int,  double,  char>,
  tuple<long, float,   const char*>,
  tuple<int&, double&, char&>
>


こういうのを用意して

template <char ...Args>
class tuple_c {};

template <char ...Sequence>
struct transpose_c;

こういうことしたいんだけど

typedef
    transpose_c<
        tuple_c<'1', '2', '3'>,
        tuple_c<'4', '5', '6'>,
        tuple_c<'7', '8', '9'>
    >::type
type;

どうもうまくいかない。



参考:Haskell : transpose