LINUX.ORG.RU

как поднять ограничение на 50 элементов в fusion vector?

 boost.fusion,


1

4

Может быть кто-нибудь сталкивался? Скармливаю довольно длинную MPL sequence и хочу получить fusion vector, но вываливается с

fusion/container/vector/convert.hpp:26:13: error: invalid use of incomplete type ‘struct boost::fusion::detail::as_vector<55>’

Там в заголовках вакханалия из Boost.Preprocessing макросов с которой пытаюсь разобраться, но пока безуспешно.

Пробовал и -DFUSION_MAX_VECTOR_SIZE=100 и -DBOOST_FUSION_DONT_USE_PREPROCESSED_FILES в разных комбинациях, все одно.

error: invalid use of incomplete type

Уверен, что включил все необходимые заголовочники?

m0rph ★★★★★
()

Для будущих поколений:

  1. Добавляем дефайны в Makefile
    -DBOOST_FUSION_DONT_USE_PREPROCESSED_FILES -DBOOST_MPL_CFG_NO_PREPROCESSED_HEADERS -DFUSION_MAX_VECTOR_SIZE=50
    
  2. Создаем заголовочнй файл (приведен ниже) и включаем его ДО попытки создать fusion sequence размером более 50 элементов

Сам файл страшен, но что поделать :) Максимум элементов задается в MAX_N и лучше его не задирать прозапас, а держать на уровне реальных значений, иначе скорость компиляции падает и ошибки с темплетами на 3 экрана разбухают до 4-5 :)

#define MAX_N 70

#include <boost/preprocessor/iterate.hpp>

#include <boost/mpl/vector.hpp>
#include <boost/mpl/vector/vector50.hpp>

namespace boost { namespace mpl {
#   define BOOST_PP_ITERATION_PARAMS_1 \
    (3,(51, MAX_N, <boost/mpl/vector/aux_/numbered.hpp>))
#   include BOOST_PP_ITERATE()
}}
#undef BOOST_MPL_LIMIT_VECTOR_SIZE 
#define BOOST_MPL_LIMIT_VECTOR_SIZE MAX_N

#define FUSION_MAX_VECTOR_SIZE 50  //maximum value for stock boost fusion

#include <boost/fusion/container/vector.hpp>
#include <boost/fusion/container/vector/vector50.hpp>
#include <boost/fusion/container/vector/detail/as_vector.hpp>

namespace boost { namespace fusion {
# define BOOST_PP_ITERATION_PARAMS_1				\
        (3,(51, MAX_N, <boost/fusion/container/vector/detail/vector_n.hpp>))
# include BOOST_PP_ITERATE()
}}

namespace boost { namespace fusion { namespace detail
{

#define BOOST_FUSION_NEXT_ITERATOR(z, n, data)                                  \
    typedef typename fusion::result_of::next<BOOST_PP_CAT(I, n)>::type          \
        BOOST_PP_CAT(I, BOOST_PP_INC(n));

#define BOOST_FUSION_NEXT_CALL_ITERATOR(z, n, data)                             \
    typename gen::BOOST_PP_CAT(I, BOOST_PP_INC(n))                              \
        BOOST_PP_CAT(i, BOOST_PP_INC(n)) = fusion::next(BOOST_PP_CAT(i, n));

#define BOOST_FUSION_VALUE_OF_ITERATOR(z, n, data)                              \
    typedef typename fusion::result_of::value_of<BOOST_PP_CAT(I, n)>::type      \
        BOOST_PP_CAT(T, n);

#define BOOST_PP_FILENAME_1 <boost/fusion/container/vector/detail/as_vector.hpp>
#define BOOST_PP_ITERATION_LIMITS (51, MAX_N)
#include BOOST_PP_ITERATE()

#undef BOOST_FUSION_NEXT_ITERATOR
#undef BOOST_FUSION_NEXT_CALL_ITERATOR
#undef BOOST_FUSION_VALUE_OF_ITERATOR

}}}

#undef FUSION_MAX_VECTOR_SIZE
#define FUSION_MAX_VECTOR_SIZE MAX_N
redbaron ★★
() автор топика
Ответ на: комментарий от redbaron

Для будущих поколений:

Не переживай, будущие поколения не будут пользоваться этим говнищем.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.