2012-04-18 16 views
2

考えると使用して、配列の時の初期化をコンパイルします。私はそれはのようになります考えてブーストPP&MPL

for(size_t i = 0; i < numTypes; ++i) 
{ 
    for(size_t j = 0; j < numTypes; ++j) 
    { 
     arr[i*numTypes+j] = ObjPair<boost::mpl::at_c<vecType, i>::type, boost::mpl::at_c<vecType, j>::type>::Foo; 
    } 
} 

:私はコンパイル時にこの種の機能を取得しようとしている

typedef boost::mpl::vector<Type1, Type2, Type3> types; 
const size_t numTypes = boost::mpl::size<types>::value; 
std::array<std::function<bool(const obj&, const obj&)>, numTypes*numTypes> arr; 

を:

std::array<std::function<bool(const obj&, const obj&)>, numTypes*numTypes> arr = { BOOST_PP_FOR((0, numTypes), PRED, OP, MACRO) }; 

しかし、私はそれが(私はBOOST_PP_FORを使用しての私の完全な失敗した試みを投稿していなかった)作業を取得することはできません。

ObjPair<T1, T2>::Fooは、署名の静的メソッドbool(const obj&, const obj&)です。異なるobj型に特化しています。

私は、この配列を使用して特定のオブジェクトのペアを特定します。オブジェクトは基底クラスとして保持され、基本クラスで使用可能なIDに基づいてインデックスを決定するために、数学で配列をインデックスできます。

+1

http://stackoverflow.com/questions/2978259/programmatically-createを参照してください、 -static-arrays-at-compile-time-in-c – TemplateRex

答えて

2

PPがboost::mpl::vectorサイズ以上で繰り返すことはできません。あなたはそれを定義しようとすることができます。

typedef boost::mpl::vector<bool, short, long> vecType; 
#define numTypes 3 

私はブーストアレイと試みるので、私は何のTR1を持っていません:C++ 11で直接これを行うための

typedef boost::function<bool(const obj&, const obj&)> Function; 
typedef boost::array<Function, numTypes*numTypes> FooArray; 

#define OBJPAIR_FOO_ARRAY(z, n, text) BOOST_PP_COMMA_IF(n) &ObjPair<  \ 
boost::mpl::at_c<vecType, n/numTypes>::type, \ 
boost::mpl::at_c<vecType, n%numTypes>::type \ 
    >::Foo 

FooArray fooArray= { 
    BOOST_PP_REPEAT(BOOST_PP_MUL(numTypes, numTypes) , OBJPAIR_FOO_ARRAY,) 
}; 
+0

ありがとう! '#define numTypes 3 'でハードコードされた' 3'の代わりに 'boost :: mpl :: size :: value'を使うにはどうしたらいいですか?整数リテラル以外のすべてがコンパイルエラーを起こすのはなぜですか? – David

+0

BOOST_PP_REPEATは、 'REPEAT_TIMES_2'のように他のマクロに展開するために、' 3'ウィジェットが 'REPEAT_TIMES_3'のようなものに接着されている必要があります。文字通り '3 '以外のものは動作しません。 – Arpegius

+0

3の代わりにBOOST_PP_SLOTを使用する方法はありますか?私はこのコードがリモートでデバッグ可能であることを願っています。私はコンパイルエラーを理解することすらできません。 – David

関連する問題