C ++ Boost MPL / Fusion векторов динамического push_back - PullRequest
2 голосов
/ 22 марта 2012

Я новичок в мире TMP, и мне нужна помощь по использованию векторов в boost mpl или fusion.

Итак, вот такая ситуация:

У меня есть API для асинхронной функциивызовы в многопоточной среде, которая реализована как библиотека времени выполнения, говорят: async_call (function_ptr, arg1, arg2, ... argN);Функции имеют переменное число аргументов.

Таким образом, код приложения будет выглядеть следующим образом:

void funcA(int a){
   // code
}

void funcB(int a, double b, char C){
   // code
}  

int main(){
   int a = 1;
   double b = 2.0;
   char c = 'C';

   async_call(funcA, a);
   async_call(funcB, a,b,c);
}

Библиотека хранит значения аргументов в некоторых внутренних структурах данных и выполняет функции вкакое-то время в будущем определит библиотека.Чтобы реализовать некоторую оптимизацию, мне нужно знать все возможное различное количество аргументов для конкретного приложения и заполнять константный массив, содержащий количество аргументов: поэтому во время компиляции необходимо заполнить что-то вроде:

const int ArgsNumber[] = {1,3}; 

Я реализовал async_call как шаблонную функцию с переменным числом аргументов и внутренне подсчитываю количество аргументов (count_args <...> каждой переданной функции, используя метапрограммирование некоторого шаблона

template<typename Tr, typename ...Tn>
void async_call(Tr (*func)(Tn...), Tn... args) {
  // ...
  int args_num = count_args<Tn...>::value;
  // ...
}

И вот вопрос:Я заполняю глобальный вектор MPL или FUSION результатами count_args <...>, а затем преобразую его в массив const?

Я видел некоторый код, предлагающий препроцессор boost для генерации массива const из вектора MPLкак это:

#define MACRO(z, i, data) \
mpl::at_c<data,i>::value

static const data[] = { BOOST_PP_ENUM(N, MACRO, argsTable) };

Итак, я объявляю вектор mpl глобально:

typedef mpl::vector_c<int> argsTable;

и пытаюсь push_back из функции async_call (которая вызывается из main) следующим образом:

typedef typename mpl::push_back<argsTable,mpl::int_<count_args<Tn...>::value>>::type xyz;

Однако вектор не обновляется, так как я должен как-то "обновить"e "argsTable с новой последовательностью, возвращаемой push_back!Я могу это сделать?Достаточно ли MPL или мне нужно объединение?

Любые другие предложения по решению более чем приветствуются!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...