boost::fusion::zip

fusion::zipは、タプルのタプルを返すらしい(実際はこんなコードは書かないけど型の確認用):

#include <iostream>
#include <string>
#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/include/zip.hpp>
#include <boost/fusion/include/io.hpp>

namespace fusion = boost::fusion;

int main()
{
    const fusion::vector<int, double> a(1, 2.3);
    const fusion::vector<char, std::string> b('a', "hoge");

    const fusion::vector<
            fusion::vector<int, char>,
            fusion::vector<double, std::string>
          > c = fusion::zip(a, b);

    std::cout << c << std::endl;
}
((1 a) (2.3 hoge))


長さが違うとどうなるのか:

#include <iostream>
#include <string>
#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/include/zip.hpp>
#include <boost/fusion/include/io.hpp>

namespace fusion = boost::fusion;

int main()
{
    const fusion::vector<int, double> a(1, 2.3);
    const fusion::vector<char> b('a');

   const fusion::vector<
            fusion::vector<int, char>
          > c = fusion::as_vector(fusion::zip(a, b));

    std::cout << c << std::endl;
}
((1 a))

長さが合わない場合は削られるようです。
boost::zip_iteratorもこうあってほしい。