Casting boost :: fusion :: vector

The numbered form of boost :: fusion :: vector looks like

template <class T1> class vector1; template<class T1, class T2> class vector2; 

and etc.

And the variation form looks like

 template<class T1 = boost::fusion::void_, class T2 = boost::fusion::void_> class vector; 

So is there a way to pour boost :: fusion :: vector from a numbered to a variational form at compile time?

+4
source share
2 answers

Do you really need compile time? There is a temporary conversion between the two, so I don't see the need for this:

 vector2<int, char> a(13, 'b'); vector<int, char> b = a; 

I tried, however, to play. I am not happy with my answer, but maybe you can work on it to find something better.

I was hoping that I could use some meta-function, but it seems to me inaccessible. In addition, with this approach, you need to define it as many times as you have different values.

Perhaps the best solution would be to first convert to a tuple ...

 #include <boost/fusion/container/vector.hpp> #include <boost/fusion/container/vector/vector10.hpp> #include <boost/fusion/include/at.hpp> #include <boost/type_traits/remove_reference.hpp> using namespace boost::fusion; template<typename NumVec2> struct cast { typedef typename result_of::at_c<NumVec2, 0>::type T1; typedef typename result_of::at_c<NumVec2, 1>::type T2; typedef vector<typename boost::remove_reference<T1>::type, typename boost::remove_reference<T2>::type > type; }; int main(int, char**){ vector2<int, char> a(13, 'b'); typedef cast< vector2<int,char> >::type casted_t; casted_t other(10, 'f'); } 
+2
source

So it seems that I have an answer

 using numbered_vector = fusion::vector3<int, char, float> struct as_vvector { template <class T> class result; template <class Self, class ... Args> struct result <Self(Args...)> { using type = fusion::vector< typename std::remove_reference<Args>::type...>; }; }; using variadic_vector = typename fusion::result_of::invoke< as_vvector, numbered_vector>::type; 
0
source

All Articles