12

ブーストタプルのドキュメントには次のように書かれています:

現在のバージョンでは、0 ~ 10 個の要素を持つタプルがサポートされています。必要に応じて、上限を数十要素まで増やすことができます。

ただし、これを行う方法が記載されている場所が見つかりませんでした。

タプルにBOOST_MPL_LIMIT_VECTOR_SIZE要素を持たせたい (デフォルトで 20)。これは、すべてのコンテナが同じ数の要素を持つように、 との間mpl::vectorsをマッピングしているためです。boost::tuples

4

2 に答える 2

5

朗報です。答えを見つけてください。マクロを使用して最大パラメータを再定義するだけです。boost のライブラリ FUSION は、タプルを再定義します。次の手順に従ってください。タプル パラメーターを簡単に拡張できます。

  1. タプルファイルを含める前に FUSION_MAX_VECTOR_SIZE を定義します
  2. 通常のタプル ヘッダーの代わりに Fusion または TR1 バージョンのタプル ヘッダー ファイルを含めます

     #define FUSION_MAX_VECTOR_SIZE 50
     #include <boost/tr1/tuple.hpp>
    

上記のコードをよりよく理解するには、ヘッダー ファイル「boost/tr1/tuple.hpp」を参照してください。

ファイルには、古いタプル実装を参照する別の「BOOST_TR1_USE_OLD_TUPLE」があります。

Fusion のタプル実装「boost/fusion/tuple/tuple.hpp」には、別のマクロがあります。「BOOST_FUSION_DONT_USE_PREPROCESSED_FILES」。定義されていない場合、ライブラリは事前に作成されたヘッダー ファイルを使用します。最大パラメーターは 50 です。さらに必要な場合は、このマクロを true に定義するだけでよいと思います。実際には試していませんが、コードから、より多くのパラメーターを使用しても問題ないはずです。私には50で十分だからです;)

FUSION_MAX_VECTOR_SIZE を定義するだけで、パラメーターが 50 を超える必要がある場合は、別の問題を見つけてください。既存のプロセス ヘッダー ファイルを使用する代わりに、ベクター テンプレート用の独自のヘッダー ファイルを作成する必要があります。次のコードに加えて、マクロ「BOOST_FUSION_DONT_USE_PREPROCESSED_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()
}
}
于 2012-11-23T20:35:44.000 に答える
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;

したがって、そのテンプレート パラメータ カウントは上限の 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);
于 2011-06-21T12:53:37.680 に答える