I would use the Boost MPL and Fusion libraries. There are two ways to get a list of types: generate them or explicitly define them. The first bit is more flexible, but itโs hard to say what suits you because we donโt know how you get the values โโthat you have.
In any case, giving rise to:
#include <boost/mpl/for_each.hpp> #include <boost/mpl/range_c.hpp> #include <boost/mpl/transform.hpp> #include <boost/mpl/vector.hpp> #include <array> #include <iostream> namespace bmpl = boost::mpl; // turns an index into an array template <typename T> struct make_array { // or whatever scheme you have static const std::size_t size = T::value * 2; // define generated type typedef std::array<int, size> type; }; // list of values to convert typedef bmpl::range_c<size_t, 1, 10> array_range; // transform that list into arrays, into a vector typedef bmpl::transform<array_range, make_array<bmpl::_1>, bmpl::back_inserter<bmpl::vector<>> >::type array_collection;
Or explicitly indicating:
#include <boost/mpl/vector.hpp> #include <array> #include <iostream> namespace bmpl = boost::mpl; // list all array types typedef bmpl::vector< std::array<int, 2>, std::array<int, 4>, std::array<int, 6>, std::array<int, 8>, std::array<int, 10>, std::array<int, 12>, std::array<int, 14>, std::array<int, 16>, std::array<int, 18> > array_collection;
In any case, you can use it as follows:
#include <boost/fusion/algorithm.hpp> #include <boost/fusion/container/vector.hpp> #include <boost/fusion/mpl.hpp> #include <boost/fusion/sequence.hpp> #include <boost/mpl/for_each.hpp> #include <typeinfo> // fusion "fuses" the bridge between MPL and runtime namespace bf = boost::fusion; struct print_type { template <typename T> void operator()(const T&) const { std::cout << typeid(T).name() << "\n"; } }; struct print_values { template <typename T> void operator()(const T& pArray) const { std::cout << "Printing array with size " << pArray.size() << ":\n"; std::for_each(pArray.begin(), pArray.end(), [](int pX) { std::cout << pX << " "; }); std::cout << std::endl; } }; int main(void) { // print all the types you have bmpl::for_each<array_collection>(print_type()); std::cout.flush(); // make a usable type out of the typelist typedef bf::result_of::as_vector<array_collection>::type array_fusion; array_fusion arrays; // now have an array of different arrays, // compile-time generated but run-time usable // access like this: bf::at_c<0>(arrays)[1] = 5; bf::at_c<1>(arrays)[2] = 7; bf::at_c<2>(arrays)[0] = 135; // for_each: bf::for_each(arrays, print_values()); }