2
std::string a= "a";
std::string b= "b";
std::string c= "c";

typedef mpl::vector<EasyFixEngineA,EasyFixEngineB,EasyFixEngineC> vecType;

RegisterInFactory<EasyFixEngine, mpl::at_c<vecType,0>::type>    registerA( a); 
RegisterInFactory<EasyFixEngine, mpl::at_c<vecType,1>::type,>   registerB( b);  
RegisterInFactory<EasyFixEngine, mpl::at_c<vecType,2>::type>    registerC( c); 

boost :: mplを使用して最後の3行を自動的に生成するにはどうすればよいですか?自動的に、「同じ」行を3回繰り返す必要がないことを意味します

4

2 に答える 2

2

mpl :: for_eachを利用する1つの可能性:

#include <boost/mpl/vector.hpp>
#include <boost/mpl/for_each.hpp>

struct EasyFixEngineA { static const char* const name() { return "a"; } };
struct EasyFixEngineB { static const char* const name() { return "b"; } };

struct Registrator {
    template<class T> void operator()(T t) {
        RegisterInFactory<EasyFixEngine, T> dummy(T::name());
    }
};

// ...
typedef boost::mpl::vector<EasyFixEngineA,EasyFixEngineB> Engines;
boost::mpl::for_each<Engines>(Registrator());

のインスタンス化がTあなたのケースに適していない場合は、この質問を参照してください。

于 2011-04-21T10:42:21.507 に答える
1

非常に短い答えは、あなたができないということです。

実際、3つの異なることがあります。– MPLで実行されるコンパイル時の実行(別名メタプログラミング)。それらは型定義でのみ機能します–プレーンC ++である実行時実行(別名通常のプログラミング)(その時点ですべての型が定義されます)–変数宣言

MPL(コンパイル時)を使用してC ++コード(変数宣言)を生成し、実行時(変数の初期化)を実行するとします。

boost ::fusion(融合とはコンパイル時と実行時の操作を組み合わせることを意味します)を見たいかもしれません。boost ::fusionで3つの変数を宣言し、さらに3つの文字列を宣言する場合は、boost ::fusion::transformを使用できます。しかし、それがあなたが望むものかどうかはわかりません

于 2011-04-21T10:26:41.673 に答える