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

时间:2011-06-21 12:24:54

标签: c++ boost-tuples

boost tuple documentation说:

  

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

但是,我找不到它说的方法。

我希望元组有BOOST_MPL_LIMIT_VECTOR_SIZE个元素(默认为20个)。这是因为我在mpl::vectorsboost::tuples之间进行映射,并希望所有容器都具有相同数量的元素。

2 个答案:

答案 0 :(得分:5)

元组类以下列方式声明:

// - 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;

因此,它的模板参数count被设置为10的上限。但是,将来(C ++ 0x)可以将它声明为:

template<class... Params> 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 :(得分:5)

好消息。找到答案,只需使用宏来重新定义最大参数。 boost中的FUSION库重新定义了元组。按照以下步骤,您可以轻松扩展元组参数

  1. 在包含任何元组文件之前定义FUSION_MAX_VECTOR_SIZE
  2. 包含fusion或TR1版本的元组头文件而不是普通的元组头文件

     #define FUSION_MAX_VECTOR_SIZE 50
     #include <boost/tr1/tuple.hpp>
    
  3. 为了更好地理解上面的代码,你可以参考头文件&#34; boost / tr1 / tuple.hpp&#34;

    在文件中,它有另一个&#34; BOOST_TR1_USE_OLD_TUPLE&#34;引用旧的元组实现。

    在融合的元组实现&#34; boost / fusion / tuple / tuple.hpp&#34;中,还有另一个宏。 &#34; BOOST_FUSION_DONT_USE_PREPROCESSED_FILES&#34 ;.如果没有定义,库将使用预先创建的头文件,最大参数为50.如果需要更多,我相信你可以将此宏定义为true。从代码中可以获得更多参数,尽管我还没有真正尝试过。因为50对我来说远远不够;)

    如果您只定义FUSION_MAX_VECTOR_SIZE并且需要参数超过50,则会发现另一个问题。您必须为矢量模板提供自己的头文件,而不是使用现有的流程头文件。除了以下代码,您还需要定义宏&#34; BOOST_FUSION_DONT_USE_PREPROCESSED_FILES&#34;排除proprocessed头文件

    #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()
    }
    }