Casting Boost :: Fusion :: вектор

Пронумерованная форма boost :: fusion :: vector выглядит так

template <class T1>
class vector1;

template<class T1, class T2>
class vector2;

и т.п.

И вариадическая форма выглядит

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

Так есть ли способ приведения boost :: fusion :: vector из нумерованного в вариадическую форму во время компиляции?

4

Решение

Вы действительно нуждаетесь во время компиляции? Между ними есть преобразование во время выполнения, поэтому я не вижу необходимости:

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

Однако я попытался поиграть. Я не удовлетворен своим ответом, но, возможно, вы можете поработать над этим, чтобы найти что-то лучшее.

Я надеялся, что смогу использовать некоторую мета-функцию, но это выходит за рамки моих возможностей. Кроме того, при таком подходе вам нужно определять его столько раз, сколько у вас разных значений.

Возможно, лучшим решением было бы сначала преобразовать в кортеж …

#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

Другие решения

Так что, похоже, у меня есть ответ

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