Tôi đang cố gắng tạo danh sách đối số cho một cuộc gọi hàm trong thời gian chạy, nhưng tôi không thể nghĩ ra cách để thực hiện điều này trong C++.Tự động tạo danh sách đối số hàm C++ khi chạy
Đây là thư viện trợ giúp tôi viết. Tôi đang lấy dữ liệu đầu vào từ máy khách qua mạng và sử dụng dữ liệu đó để thực hiện cuộc gọi đến một con trỏ hàm mà người dùng đã đặt trước đó. Hàm này nhận một chuỗi (các mã thông báo, giống như printf) và một số lượng các đối số khác nhau. Những gì tôi cần là một cách để thêm nhiều đối số tùy thuộc vào dữ liệu nào đã được nhận từ máy khách.
Tôi đang lưu trữ các chức năng trong bản đồ về con trỏ hàm
typedef void (*varying_args_fp)(string,...);
map<string,varying_args_fp> func_map;
Một cách sử dụng ví dụ sẽ là
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"
này hoạt động độc đáo khi thể xác định rõ chức năng gọi và đó là lý lẽ, nhưng nếu tôi đã nhận được dữ liệu "CreateX 10 20", chương trình cần có khả năng làm cho đối số gọi chính nó. ví dụ:
// func_name = "CreateX", tokens = 'ii', first_arg = 10, second_arg = 20
func_map[func_name](tokens,first_arg,second_arg);
Tôi không thể dự đoán cách người dùng sắp xếp các chức năng và mã này trước.
Nếu có ai có đề xuất hoàn thành tác vụ này theo cách khác, vui lòng đề xuất. Tôi cần người dùng có thể "liên kết" một hàm với thư viện và để thư viện gọi nó sau này sau khi nó nhận được dữ liệu từ một khách hàng được nối mạng, một sự gọi lại về bản chất.
Run-time số đối số khác nhau? Không thể có trong C++ AFAIK, hoặc dù sao cũng sẽ rất tệ. Vấn đề (cú pháp) không phải là để nhận chúng, mà là để vượt qua chúng. Mặc dù vậy, nó có thể có trong assembly. Trong C++, bạn muốn sử dụng cấu trúc dữ liệu để lưu trữ các đối số và chuyển cấu trúc này, giống như một 'std :: list'. Tôi muốn đề nghị hãy xem boost.spirit –
dyp
Cách này để vượt qua số biến của các đối số không được chấp nhận trong C++ –
Đó là suy nghĩ ban đầu của tôi, nhưng nếu một hàm có 2 loại đối số khác nhau thì tôi không thể lưu trữ chúng lại với nhau . – PudgePacket