2012-02-21 2 views
2

Я хочу определить boost fusion :: vector в моем классе с размером, определяемым параметром шаблона. ATM Я делаю это со специализацией класса-помощника, но я думаю, что должен быть способ сделать это с помощью boost mpl/fusion или что-то еще в одной строке.Определить кортеж с переменным размером

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; 
}; 

Любые идеи?

+3

Вы уверены, что не используете ['boost :: array '] (http://www.boost.org/doc/libs/release/doc/html/array.html) (' array' также включен в стандартную библиотеку C++ 11)? –

+0

Не знаю, почему я об этом не думал. Может быть лучшим решением. – Smittii

ответ

3

Вы можете сделать это рекурсивно:

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> 
{}; 
+0

Спасибо, будет использовать этот или простой boost :: array – Smittii

1

Вы могли бы использовать это:

template<int N, typename T> 
struct create_tuple 
{ 
private: 
    template<int i, int n, typename ...U> 
    struct creator; 

    template<typename ...U> 
    struct creator<N,N, U...> 
    { 
     typedef boost::fusion::vector<U...> type; 
    }; 
    template<int i, typename ...U> 
    struct creator<i, N,T, U...> 
    { 
     typedef typename creator<i+1,N,T,U...>::type type; 
    }; 
public: 
    typedef typename creator<1,N,T>::type type; 
}; 

template<int N, class T> 
struct DimensionTupleSize 
{ 
    typedef typename create_tuple<N,T>::type type; 
}; 
2

Если вы действительно хотите кортеж, а не массив, и вы просто ищете наиболее succinct solution ..,

#include <boost/array.hpp> 
#include <boost/fusion/include/boost_array.hpp> 
#include <boost/fusion/include/as_vector.hpp> 

template<std::size_t DimN, typename T> 
struct DimensionTupleSize : boost::fusion::result_of::as_vector< 
    boost::array<T, DimN> 
>::type 
{ }; 
Смежные вопросы