可変サイズのタプルを定義します
-
28-10-2019 - |
質問
テンプレートパラメーターで定義されたサイズを使用して、クラスのブースト融合::ベクターを定義したい。 ATMヘルパークラスの専門でこれを行っていますが、Boost MPL/Fusionまたは他の何かを1行で行う方法があるはずです。
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;
};
何か案は?
解決
あなたはそれを再帰的に行うことができます:
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>
{};
他のヒント
あなたが本当にアレイではなくタプルが欲しいなら、そしてあなたが単に最も探しているなら 簡潔 解決..、
#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
{ };
これを使用できます:
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;
};
所属していません StackOverflow