C++ Boost MPL / Fusion векторов динамического push_back

Я новичок в мире 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;

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

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

0 ответов

Другие вопросы по тегам