Я новичок в мире 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 или мне нужно объединение?
Любые другие предложения по решению более чем приветствуются!