Próbuję wygenerować listę argumentów dla wywołania funkcji w czasie wykonywania, ale nie mogę wymyślić sposobu, aby osiągnąć to w języku C++.Dynamiczne tworzenie listy argumentów funkcji C++ w czasie wykonywania
To jest dla biblioteki pomocniczej, którą piszę. Biorę dane wejściowe od klienta przez sieć i korzystam z tych danych, aby wykonać wywołanie wskaźnika funkcji, który użytkownik ustawił wcześniej. Funkcja pobiera ciąg znaków (z tokenów, podobny do printf) i różną liczbę argumentów. Potrzebuję sposobu na dodanie większej liczby argumentów w zależności od tego, jakie dane zostały odebrane od klienta.
mam przechowywania funkcje mapy wskaźników funkcji
typedef void (*varying_args_fp)(string,...);
map<string,varying_args_fp> func_map;
Przykładem użycia może być
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"
Działa to dobrze, gdy hardcoding wywołanie funkcji i to argumenty, ale jeśli "Otrzymałem dane" CreateX 10 20 ", program musi mieć możliwość wywołania samego argumentu. np.
// func_name = "CreateX", tokens = 'ii', first_arg = 10, second_arg = 20
func_map[func_name](tokens,first_arg,second_arg);
Nie mogę przewidzieć, jak użytkownicy będą układać funkcje i kodować to wcześniej.
Jeśli ktoś ma sugestie dotyczące wykonania tego zadania w inny sposób, zachęcamy do zasugerowania. Potrzebuję użytkownika, aby móc "związać" funkcję z biblioteką i aby biblioteka mogła wywołać ją później, po otrzymaniu danych od klienta sieciowego, w skrócie oddzwanianie.
Run-time zmiennej liczby argumentów? Nie jest to możliwe w C++ AFAIK, albo i tak byłoby bardzo źle. Problem (syntaktyczny) nie polega na przyjmowaniu ich, lecz na ich przekazywaniu. Jednak powinno to być możliwe w asemblerze. W C++, wolisz używać struktury danych do przechowywania argumentów i przekazywania tej struktury, jak 'std :: list'. Proponuję rzucić okiem na boost.spirit –
dyp
Ten sposób przekazywania zmiennej liczby argumentów jest przestarzały w C++ –
To była moja pierwsza myśl, ale jeśli funkcja przyjmuje 2 różne typy argumentów, to nie mogę ich przechowywać razem . – PudgePacket