Search code examples
c++templatesboostboost-tuples

Define tuple with variable size


I want to define a boost fusion::vector in my class with the size defined by a template parameter. ATM I'm doing this with a specialization of a helper class, but I think there should be a way to do this with boost mpl/fusion or something else in just one line.

namespace detail
{
    template<int dim, typename T>
    struct DimensionTupleSize
    { };
    template <typename T>
    struct DimensionTupleSize<1>
    {
        enum { Dimension = 1 }
        typedef boost::fusion::vector<T> type;
    };
    template <typename T>
    struct DimensionTupleSize<2>
    {
        enum { Dimension = 2 }
        typedef boost::fusion::vector<T, T> type;
    };
    template <typename T>
    struct DimensionTupleSize<3>
    {
        enum { Dimension = 3 }
        typedef boost::fusion::vector<T, T, T> type;
    };
}

template<int Dim = 2>
class QuadTreeLevel
{
public:
    detail::DimensionTupleSize<Dim>::type tpl;
};

Any ideas?


Solution

  • You can do it recursively :

    template<int N, class T> struct DimensionTupleSizeImpl
    {
      typedef typename DimensionTupleSizeImpl<N-1,T>::type                   base;
      typedef typename boost::fusion::result_of::push_back<base,T>::type type;
    };
    
    template<class T> struct DimensionTupleSizeImpl<0,T>
    {
      typedef boost::fusion::vector<> type;
    };
    
    template<int N, class T>
    struct  DimensionTupleSize
          : boost::fusion::result_of::
            as_vector<typename DimensionTupleSizeImpl<N,T>::type>
    {};