C++ boost元组:增加元素的最大数量

C++ boost元组:增加元素的最大数量,c++,boost-tuples,C++,Boost Tuples,报告说: 当前版本支持元组 有0-10个元素。如有需要, 上限可以增加到, 比如说,几十种元素 然而,我找不到它在哪里说如何做到这一点 我希望元组包含BOOST\u MPL\u LIMIT\u VECTOR\u SIZE元素(默认为20个)。这是因为我正在mpl::vectors和boost::tuples之间映射,并且希望所有容器都具有相同数量的元素。tuple类以以下方式声明: // - tuple forward declaration --------------------------

报告说:

当前版本支持元组 有0-10个元素。如有需要, 上限可以增加到, 比如说,几十种元素

然而,我找不到它在哪里说如何做到这一点


我希望元组包含
BOOST\u MPL\u LIMIT\u VECTOR\u SIZE
元素(默认为20个)。这是因为我正在
mpl::vectors
boost::tuples
之间映射,并且希望所有容器都具有相同数量的元素。

tuple类以以下方式声明:

// - tuple forward declaration -----------------------------------------------
template <
  class T0 = null_type, class T1 = null_type, class T2 = null_type,
  class T3 = null_type, class T4 = null_type, class T5 = null_type,
  class T6 = null_type, class T7 = null_type, class T8 = null_type,
  class T9 = null_type>
class tuple;
#define VARIADIC_PARAMS_DEFVAL0(type_name, value)
#define VARIADIC_PARAMS_DEFVAL1(type_name, value)   type_name##0 = value
#define VARIADIC_PARAMS_DEFVAL2(type_name, value)   VARIADIC_PARAMS_DEFVAL1(type_name, value), type_name##1 = value
#define VARIADIC_PARAMS_DEFVAL3(type_name, value)   VARIADIC_PARAMS_DEFVAL2(type_name, value), type_name##2 = value
#define VARIADIC_PARAMS_DEFVAL4(type_name, value)   VARIADIC_PARAMS_DEFVAL3(type_name, value), type_name##3 = value
#define VARIADIC_PARAMS_DEFVAL5(type_name, value)   VARIADIC_PARAMS_DEFVAL4(type_name, value), type_name##4 = value
#define VARIADIC_PARAMS_DEFVAL6(type_name, value)   VARIADIC_PARAMS_DEFVAL5(type_name, value), type_name##5 = value
#define VARIADIC_PARAMS_DEFVAL7(type_name, value)   VARIADIC_PARAMS_DEFVAL6(type_name, value), type_name##6 = value
#define VARIADIC_PARAMS_DEFVAL8(type_name, value)   VARIADIC_PARAMS_DEFVAL7(type_name, value), type_name##7 = value
#define VARIADIC_PARAMS_DEFVAL9(type_name, value)   VARIADIC_PARAMS_DEFVAL8(type_name, value), type_name##8 = value
#define VARIADIC_PARAMS_DEFVAL10(type_name, value)  VARIADIC_PARAMS_DEFVAL9(type_name, value), type_name##9 = value
// ...
#define VARIADIC_PARAMS_DEFVAL100(type_name, value) VARIADIC_PARAMS_DEFVAL99(type_name, value), type_name##99 = value
#define VARIADIC_PARAMS_DEFVAL(type_name, value, n) VARIADIC_PARAMS_DEFVAL##n(type_name, value)

#define VARIADIC_MACRO_INVOKE0(macro)    macro(0)
#define VARIADIC_MACRO_INVOKE1(macro)    VARIADIC_MACRO_INVOKE0(macro); macro(1)
#define VARIADIC_MACRO_INVOKE2(macro)    VARIADIC_MACRO_INVOKE1(macro); macro(2)
#define VARIADIC_MACRO_INVOKE3(macro)    VARIADIC_MACRO_INVOKE2(macro); macro(3)
#define VARIADIC_MACRO_INVOKE4(macro)    VARIADIC_MACRO_INVOKE3(macro); macro(4)
#define VARIADIC_MACRO_INVOKE5(macro)    VARIADIC_MACRO_INVOKE4(macro); macro(5)
#define VARIADIC_MACRO_INVOKE6(macro)    VARIADIC_MACRO_INVOKE5(macro); macro(6)
#define VARIADIC_MACRO_INVOKE7(macro)    VARIADIC_MACRO_INVOKE6(macro); macro(7)
#define VARIADIC_MACRO_INVOKE8(macro)    VARIADIC_MACRO_INVOKE7(macro); macro(8)
#define VARIADIC_MACRO_INVOKE9(macro)    VARIADIC_MACRO_INVOKE8(macro); macro(9)
#define VARIADIC_MACRO_INVOKE10(macro)   VARIADIC_MACRO_INVOKE9(macro); macro(10)
// ...
#define VARIADIC_MACRO_INVOKE100(macro)  VARIADIC_MACRO_INVOKE99(macro); macro(100)
#define VARIADIC_MACRO_INVOKE(macro, n)  VARIADIC_MACRO_INVOKE##n(macro)

#define TUPPLE_UPPER_LIMIT      50

#define FORWARD_DECLARE_TUPPLE(N)                       \
template<VARIADIC_PARAMS_DEFVAL(class, null_type, N)    \
class tuple;

FS_VARIADIC_MACRO_INVOKE(FORWARD_DECLARE_TUPPLE, TUPPLE_UPPER_LIMIT);
//-元组前向声明-----------------------------------------------
模板<
T0类=空类型,T1类=空类型,T2类=空类型,
T3类=零型,T4类=零型,T5类=零型,
T6类=空类型,T7类=空类型,T8类=空类型,
类别T9=空\u类型>
类元组;
因此,其模板参数计数设置为上限10。但是,将来(C++0x)可以这样声明:

template<class... Params> class tuple;
模板类元组;
因此,我认为目前不可能在实践中提高上限。可以通过以下方式实现:

// - tuple forward declaration -----------------------------------------------
template <
  class T0 = null_type, class T1 = null_type, class T2 = null_type,
  class T3 = null_type, class T4 = null_type, class T5 = null_type,
  class T6 = null_type, class T7 = null_type, class T8 = null_type,
  class T9 = null_type>
class tuple;
#define VARIADIC_PARAMS_DEFVAL0(type_name, value)
#define VARIADIC_PARAMS_DEFVAL1(type_name, value)   type_name##0 = value
#define VARIADIC_PARAMS_DEFVAL2(type_name, value)   VARIADIC_PARAMS_DEFVAL1(type_name, value), type_name##1 = value
#define VARIADIC_PARAMS_DEFVAL3(type_name, value)   VARIADIC_PARAMS_DEFVAL2(type_name, value), type_name##2 = value
#define VARIADIC_PARAMS_DEFVAL4(type_name, value)   VARIADIC_PARAMS_DEFVAL3(type_name, value), type_name##3 = value
#define VARIADIC_PARAMS_DEFVAL5(type_name, value)   VARIADIC_PARAMS_DEFVAL4(type_name, value), type_name##4 = value
#define VARIADIC_PARAMS_DEFVAL6(type_name, value)   VARIADIC_PARAMS_DEFVAL5(type_name, value), type_name##5 = value
#define VARIADIC_PARAMS_DEFVAL7(type_name, value)   VARIADIC_PARAMS_DEFVAL6(type_name, value), type_name##6 = value
#define VARIADIC_PARAMS_DEFVAL8(type_name, value)   VARIADIC_PARAMS_DEFVAL7(type_name, value), type_name##7 = value
#define VARIADIC_PARAMS_DEFVAL9(type_name, value)   VARIADIC_PARAMS_DEFVAL8(type_name, value), type_name##8 = value
#define VARIADIC_PARAMS_DEFVAL10(type_name, value)  VARIADIC_PARAMS_DEFVAL9(type_name, value), type_name##9 = value
// ...
#define VARIADIC_PARAMS_DEFVAL100(type_name, value) VARIADIC_PARAMS_DEFVAL99(type_name, value), type_name##99 = value
#define VARIADIC_PARAMS_DEFVAL(type_name, value, n) VARIADIC_PARAMS_DEFVAL##n(type_name, value)

#define VARIADIC_MACRO_INVOKE0(macro)    macro(0)
#define VARIADIC_MACRO_INVOKE1(macro)    VARIADIC_MACRO_INVOKE0(macro); macro(1)
#define VARIADIC_MACRO_INVOKE2(macro)    VARIADIC_MACRO_INVOKE1(macro); macro(2)
#define VARIADIC_MACRO_INVOKE3(macro)    VARIADIC_MACRO_INVOKE2(macro); macro(3)
#define VARIADIC_MACRO_INVOKE4(macro)    VARIADIC_MACRO_INVOKE3(macro); macro(4)
#define VARIADIC_MACRO_INVOKE5(macro)    VARIADIC_MACRO_INVOKE4(macro); macro(5)
#define VARIADIC_MACRO_INVOKE6(macro)    VARIADIC_MACRO_INVOKE5(macro); macro(6)
#define VARIADIC_MACRO_INVOKE7(macro)    VARIADIC_MACRO_INVOKE6(macro); macro(7)
#define VARIADIC_MACRO_INVOKE8(macro)    VARIADIC_MACRO_INVOKE7(macro); macro(8)
#define VARIADIC_MACRO_INVOKE9(macro)    VARIADIC_MACRO_INVOKE8(macro); macro(9)
#define VARIADIC_MACRO_INVOKE10(macro)   VARIADIC_MACRO_INVOKE9(macro); macro(10)
// ...
#define VARIADIC_MACRO_INVOKE100(macro)  VARIADIC_MACRO_INVOKE99(macro); macro(100)
#define VARIADIC_MACRO_INVOKE(macro, n)  VARIADIC_MACRO_INVOKE##n(macro)

#define TUPPLE_UPPER_LIMIT      50

#define FORWARD_DECLARE_TUPPLE(N)                       \
template<VARIADIC_PARAMS_DEFVAL(class, null_type, N)    \
class tuple;

FS_VARIADIC_MACRO_INVOKE(FORWARD_DECLARE_TUPPLE, TUPPLE_UPPER_LIMIT);
#定义变量参数(类型名称、值)
#定义变量参数定义值1(类型名称、值)类型名称0=值
#定义可变参数定义2(类型名称、值)可变参数定义1(类型名称、值),类型名称定义1=值
#定义可变参数定义3(类型名称、值)可变参数定义2(类型名称、值),类型名称定义2=值
#定义可变参数定义4(类型名称、值)可变参数定义3(类型名称、值),类型名称定义3=值
#定义可变参数定义5(类型名称、值)可变参数定义4(类型名称、值),类型名称定义4=值
#定义可变参数定义6(类型名称、值)可变参数定义5(类型名称、值),类型名称定义5=值
#定义可变参数定义7(类型名称、值)可变参数定义6(类型名称、值),类型名称定义6=值
#定义可变参数定义8(类型名称、值)可变参数定义7(类型名称、值),类型名称定义7=值
#定义可变参数定义9(类型名称、值)可变参数定义8(类型名称、值),类型名称定义8=值
#定义可变参数定义10(类型名称、值)可变参数定义9(类型名称、值),类型名称定义9=值
// ...
#定义可变参数定义100(类型名称、值)可变参数定义99(类型名称、值),类型名称定义99=值
#定义可变参数定义(类型名称,值,n)可变参数定义(类型名称,值)
#定义变量_宏_调用0(宏)宏(0)
#定义可变宏调用1(宏)可变宏调用0(宏);宏(1)
#定义变量宏调用2(宏)变量宏调用1(宏);宏(2)
#定义变量宏调用3(宏)变量宏调用2(宏);宏(3)
#定义变量宏调用4(宏)变量宏调用3(宏);宏(4)
#定义可变宏调用5(宏)可变宏调用4(宏);宏(5)
#定义可变宏调用6(宏)可变宏调用5(宏);宏(6)
#定义可变宏调用7(宏)可变宏调用6(宏);宏(7)
#定义变量宏调用8(宏)变量宏调用7(宏);宏(8)
#定义变量宏调用9(宏)变量宏调用8(宏);宏(9)
#定义变量宏调用10(宏)变量宏调用9(宏);宏(10)
// ...
#定义变量宏调用100(宏)变量宏调用99(宏);宏(100)
#定义变量宏调用(宏,n)变量宏调用(宏)
#定义元组上限50
#定义前向\u声明\u元组(N)\

模板好消息。找到答案,只需使用宏重新定义max参数。boost中的库融合重新定义了元组。按照以下步骤,您可以轻松地扩展元组参数

  • 在包含任何元组文件之前,定义FUSION_MAX_VECTOR_大小
  • 包括fusion或TR1版本元组头文件,而不是普通元组头文件

     #define FUSION_MAX_VECTOR_SIZE 50
     #include <boost/tr1/tuple.hpp>
    
    #定义融合_最大_向量_大小50
    #包括
    
  • 为了更好地理解上述代码,您可以参考头文件“boost/tr1/tuple.hpp”

    在该文件中,它有另一个“BOOST\u TR1\u USE\u OLD\u TUPLE”来引用旧的TUPLE实现

    在fusion的元组实现“boost/fusion/tuple/tuple.hpp”中,还有另一个宏。“BOOST\u FUSION\u不使用预处理的\u文件”。如果未定义,库将使用预先创建的头文件,最大参数为50。如果您需要更多,我相信您可以将此宏定义为true。从代码来看,虽然我还没有真正尝试过,但是有更多的参数应该是可以的。因为50对我来说就足够了;)

    如果您只定义FUSION_MAX_VECTOR_SIZE,并且需要参数大于50,请查找另一个问题。您必须为向量模板生成自己的头文件,而不是使用现有的流程头文件。除了下面的代码外,还需要定义宏“BOOST\u FUSION\u DONT\u USE\u PREPROCESSED\u FILES”来排除预处理的头文件

    #if (FUSION_MAX_VECTOR_SIZE > 50)
    
    #include <boost/fusion/container/vector/vector50.hpp>
    
    namespace boost 
    { 
    namespace mpl 
    {
    #define BOOST_PP_ITERATION_PARAMS_1 (3,(51, FUSION_MAX_VECTOR_SIZE, <boost/mpl/vector/aux_/numbered.hpp>))
    #include BOOST_PP_ITERATE()
    }
    
    namespace fusion
    {
        struct vector_tag;
        struct fusion_sequence_tag;
        struct random_access_traversal_tag;
    
        // expand vector51 to max
        #define BOOST_PP_FILENAME_1 <boost/fusion/container/vector/detail/vector_n.hpp>
        #define BOOST_PP_ITERATION_LIMITS (51, FUSION_MAX_VECTOR_SIZE)
        #include BOOST_PP_ITERATE()
    }
    }
    
    \if(融合最大向量大小>50)
    #包括
    名称空间提升
    { 
    名称空间mpl
    {
    #定义BOOST_PP_迭代_参数_1(3,(51,融合_MAX_向量_大小,)
    #包括BOOST_PP_ITERATE()
    }
    名称空间融合
    {
    结构向量标签;
    结构融合\序列\标签;
    结构随机访问遍历标记;
    //将vector51扩展到最大值
    #定义BOOST\u PP\u文件名\u 1
    #定义BOOST\u PP\u迭代限制(51,融合最大向量大小)
    #包括BOOST_PP_ITERATE()
    }
    }
    
    如果不使用C++0x,我们无法声明可变模板参数。因此,实现可以使用宏创建元组定义,这将有助于“增加”上限。然而,我认为目前这是不可能的。@2046小时