Я пытаюсь создать список аргументов для вызова функции во время выполнения, но я не могу придумать, как это сделать в C++.Динамическое создание списка аргументов функции C++ во время выполнения
Это для вспомогательной библиотеки, которую я пишу. Я беру входные данные от клиента по сети и используя эти данные для вызова указателя функции, который пользователь установил ранее. Функция принимает строку (токенов, похожих на printf) и различное количество аргументов. Мне нужен способ добавления дополнительных аргументов в зависимости от того, какие данные были получены от клиента.
Я храню функции в карте указателей на функции
typedef void (*varying_args_fp)(string,...);
map<string,varying_args_fp> func_map;
Пример использования будет
void printall(string tokens, ...)
{
va_list a_list;
va_start(a_list, tokens);
for each(auto x in tokens)
{
if (x == 'i')
{
cout << "Int: " << va_arg(a_list, int) << ' ';
}
else if(x == 'c')
{
cout << "Char: " << va_arg(a_list, char) << ' ';
}
}
va_end(a_list);
}
func_map["printall"] = printall;
func_map["printall"]("iic",5,10,'x');
// prints "Int: 5 Int: 10 Char: x"
Это хорошо работает, когда жестко прописывать вызов функции, и это аргументы, но если я «Получив данные« CreateX 10 20 », программа должна быть способна сама вызвать аргумент. например
// func_name = "CreateX", tokens = 'ii', first_arg = 10, second_arg = 20
func_map[func_name](tokens,first_arg,second_arg);
Я не могу предсказать, как пользователи будут заранее излагать функции и кодировать их заранее.
Если у кого есть предложения по выполнению этой задачи другим способом, не стесняйтесь предлагать. Мне нужно, чтобы пользователь мог «привязать» функцию к библиотеке, а для того, чтобы библиотека вызывала ее позже после того, как она получила данные от сетевого клиента, по сути, обратный вызов.
время выполнения варьируя количество аргументов? Невозможно в C++ AFAIK, иначе было бы очень плохо. Синтаксическая проблема заключается не в их получении, а в переносе. Однако это должно быть возможно в ассемблере. В C++ вы предпочитаете использовать структуру данных для хранения аргументов и передавать эту структуру, например, 'std :: list'. Я бы предложил взглянуть на boost.spirit –
dyp
Этот способ передачи переменной количества аргументов устарел в C++ –
Это была моя первоначальная мысль, но если функция принимает два разных типа аргументов, то я не могу их хранить вместе , – PudgePacket