Определить кортеж с переменным размером - PullRequest
2 голосов
/ 21 февраля 2012

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

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 ]

4 голосов
/ 21 февраля 2012

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

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>
{};
2 голосов
/ 22 февраля 2012

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

#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
{ };
1 голос
/ 21 февраля 2012

Вы можете использовать это:

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