c++ 使用超过50个转换的boost msm状态机

lymgl2op  于 2023-05-30  发布在  其他
关注(0)|答案(2)|浏览(192)

MSM的转换表使用mpl::vector。默认最大大小为20。您可以使用更改大小

#define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
#define BOOST_MPL_LIMIT_VECTOR_SIZE 50                
#define BOOST_MPL_LIMIT_MAP_SIZE 50

以允许尺寸达到50。根据文档(https://www.boost.org/doc/libs/1_80_0/libs/msm/doc/HTML/ch05.html),可以通过添加(例如,60)mpl/vector60.hpp和mpl/map60.hpp
在boost/mpl/vector中,我找到了vector50_c.hpp和vector50.hpp文件。vector50.hpp的内容是:

#ifndef BOOST_MPL_VECTOR_VECTOR50_HPP_INCLUDED
#define BOOST_MPL_VECTOR_VECTOR50_HPP_INCLUDED

// Copyright Aleksey Gurtovoy 2000-2004
//
// Distributed under the Boost Software License, Version 1.0. 
// (See accompanying file LICENSE_1_0.txt or copy at 
// http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/libs/mpl for documentation.

// $Id$
// $Date$
// $Revision$

#if !defined(BOOST_MPL_PREPROCESSING_MODE)
#   include <boost/mpl/vector/vector40.hpp>
#endif

#include <boost/mpl/aux_/config/use_preprocessed.hpp>

#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
    && !defined(BOOST_MPL_PREPROCESSING_MODE)

#   define BOOST_MPL_PREPROCESSED_HEADER vector50.hpp
#   include <boost/mpl/vector/aux_/include_preprocessed.hpp>

#else

#   include <boost/mpl/aux_/config/typeof.hpp>
#   include <boost/mpl/aux_/config/ctps.hpp>
#   include <boost/preprocessor/iterate.hpp>

namespace boost { namespace mpl {

#   define BOOST_PP_ITERATION_PARAMS_1 \
    (3,(41, 50, <boost/mpl/vector/aux_/numbered.hpp>))
#   include BOOST_PP_ITERATE()

}}

#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS

#endif // BOOST_MPL_VECTOR_VECTOR50_HPP_INCLUDED

1.是否需要添加文件vector60_c.hpp和vector60.hpp?(两者有什么区别?)
1.我在哪里添加它们?内部boost/mpl/vector?
1.如何修改文件?
我对编写vector60.hpp的第一个猜测是:

#ifndef BOOST_MPL_VECTOR_VECTOR60_HPP_INCLUDED
#define BOOST_MPL_VECTOR_VECTOR60_HPP_INCLUDED

// Copyright Aleksey Gurtovoy 2000-2004
//
// Distributed under the Boost Software License, Version 1.0. 
// (See accompanying file LICENSE_1_0.txt or copy at 
// http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/libs/mpl for documentation.

// $Id$
// $Date$
// $Revision$

#if !defined(BOOST_MPL_PREPROCESSING_MODE)
#   include <boost/mpl/vector/vector50.hpp>
#endif

#include <boost/mpl/aux_/config/use_preprocessed.hpp>

#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
    && !defined(BOOST_MPL_PREPROCESSING_MODE)

#   define BOOST_MPL_PREPROCESSED_HEADER vector60.hpp
#   include <boost/mpl/vector/aux_/include_preprocessed.hpp>

#else

#   include <boost/mpl/aux_/config/typeof.hpp>
#   include <boost/mpl/aux_/config/ctps.hpp>
#   include <boost/preprocessor/iterate.hpp>

namespace boost { namespace mpl {

#   define BOOST_PP_ITERATION_PARAMS_1 \
    (3,(51, 60, <boost/mpl/vector/aux_/numbered.hpp>))
#   include BOOST_PP_ITERATE()

}}

#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS

#endif // BOOST_MPL_VECTOR_VECTOR60_HPP_INCLUDED

编辑:我尝试运行的最小示例

#define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
#define BOOST_MPL_LIMIT_VECTOR_SIZE 60
#include <boost/mpl/vector.hpp>

int main() {

    typedef boost::mpl::vector<
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int
            > vector_51;

    return 0;
}

当前产生错误

/usr/include/boost/mpl/vector.hpp:36:1: fatal error: boost/mpl/vector/vector60.hpp: No such file or directory
   36 | #   include BOOST_PP_STRINGIZE(boost/mpl/vector/AUX778076_VECTOR_HEADER)

我的首选解决方案是在编译时生成代码的include之前添加一些代码。但是,让我的示例使用自编写的文件将是很好的第一步。

ie3xauqp

ie3xauqp1#

是否需要添加文件vector60_c.hpp和vector60.hpp?(两者有什么区别?)
取决于MSM使用vector还是vector_c。区别:https://www.boost.org/doc/libs/1_80_0/libs/mpl/doc/refmanual/vector-c.html
preprocessed/README.txt中记录了生成丢失文件的方法。
在我的Ubuntu盒子上,我可以:

cd ~/custom/superboost/libs/mpl
python2.7 ./preprocessed/boost_mpl_preprocess.py

它生成了文件,并修改了许多现有的头文件,例如。aux_/preprocessed/plain/vector.hpp,现在包含

template<
      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
    , typename T12 = na, typename T13 = na, typename T14 = na
    , typename T15 = na, typename T16 = na, typename T17 = na
    , typename T18 = na, typename T19 = na, typename T20 = na
    , typename T21 = na, typename T22 = na, typename T23 = na
    , typename T24 = na, typename T25 = na, typename T26 = na
    , typename T27 = na, typename T28 = na, typename T29 = na
    , typename T30 = na, typename T31 = na, typename T32 = na
    , typename T33 = na, typename T34 = na, typename T35 = na
    , typename T36 = na, typename T37 = na, typename T38 = na
    , typename T39 = na, typename T40 = na, typename T41 = na
    , typename T42 = na, typename T43 = na, typename T44 = na
    , typename T45 = na, typename T46 = na, typename T47 = na
    , typename T48 = na, typename T49 = na, typename T50 = na
    , typename T51 = na, typename T52 = na, typename T53 = na
    , typename T54 = na, typename T55 = na, typename T56 = na
    , typename T57 = na, typename T58 = na, typename T59 = na
    , typename T60 = na, typename T61 = na, typename T62 = na
    , typename T63 = na, typename T64 = na, typename T65 = na
    , typename T66 = na, typename T67 = na, typename T68 = na
    , typename T69 = na, typename T70 = na, typename T71 = na
    , typename T72 = na, typename T73 = na, typename T74 = na
    , typename T75 = na, typename T76 = na, typename T77 = na
    , typename T78 = na, typename T79 = na, typename T80 = na
    , typename T81 = na, typename T82 = na, typename T83 = na
    , typename T84 = na, typename T85 = na, typename T86 = na
    , typename T87 = na, typename T88 = na, typename T89 = na
    , typename T90 = na, typename T91 = na, typename T92 = na
    , typename T93 = na, typename T94 = na, typename T95 = na
    , typename T96 = na, typename T97 = na, typename T98 = na
    , typename T99 = na
    >
struct vector;

与之前相比

template<
      typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
    , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
    , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
    , typename T12 = na, typename T13 = na, typename T14 = na
    , typename T15 = na, typename T16 = na, typename T17 = na
    , typename T18 = na, typename T19 = na
    >
struct vector;
dpiehjr4

dpiehjr42#

您可以使用boost::mp11::mp_list替换boost::mpl::vector。这个boost::mp11库是现代C++11(顾名思义),它没有限制-它只是使用可变模板。
对于转换表-您需要记住it does not support inheritance-因此您需要以这种方式替换:

// old mpl::vector way - limitation of 50
struct transition_table : boost::mpl::vector < rows.... >;

// new mp11 way - no limitations
using transition_table = boost::mp11::mp_list<rows...>;

您还需要包含<boost/mp11/mpl.hpp>,以便所有boost::mpl“算法”都可以在boost::mp11上工作

相关问题