Регистрация типов из вектора наддува mpl - PullRequest
2 голосов
/ 21 апреля 2011
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); 

Как я могу автоматически сгенерировать последние 3 строки, используя boost :: mpl? Под автоматическим я имею в виду, не нужно повторять 3 раза "ту же" строку

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

Одна возможность с использованием mpl :: for_each :

#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 не подходит в вашем случае, см. этот вопрос .

1 голос
/ 21 апреля 2011

Очень короткий ответ: вы не можете.

На самом деле есть три разные вещи: - выполнение во время компиляции (иначе метапрограммирование), которое выполняется с помощью MPL.Они работают только с определениями типов - выполнение во время выполнения (иначе обычное программирование), которое является простым C ++ (на тот момент все типы определены) - объявления переменных

Вы хотите использовать MPL (время компиляции)чтобы сгенерировать некоторый код C ++ (объявление переменной) и выполнить некоторое время выполнения (инициализация переменных).

Возможно, вы захотите взглянуть на boost :: fusion (fusion означает объединение операций во время компиляции и во время выполнения).Если вы объявите свои три переменные в boost :: fusion, а также три строки, то вы можете использовать boost :: fusion :: transform.Но я не уверен, что ты этого хочешь

...