Tôi đang sử dụng gcc 4.6. Giả sử rằng có một v vectơ tham số tôi phải chuyển đến hàm variadic f (const char * format, ...).Chuyển std :: vector <int> mục sang hàm variadic
Một cách tiếp cận để làm điều này là:.
void VectorToVarArgs(vector<int> &v)
{
switch(v.size())
{
case 1: f("%i", v[0]);
case 2: f("%i %i", v[0], v[1]);
case 3: f("%i %i %i", v[0], v[1], v[2]);
case 4: f("%i %i %i %i", v[0], v[1], v[2], v[3]);
// etc...
default:
break;
}
}
// where function f is
void f(const char* format, ...)
{
va_list args;
va_start (args, format);
vprintf (format, args);
va_end (args);
}
Vấn đề là tất nhiên nó không hỗ trợ một số tùy ý của các mục trong vector v Tuy nhiên, tôi tin rằng đã hiểu thế nào va_lists công trình nguyên tắc, tức là bằng cách đọc các đối số từ ngăn xếp, bắt đầu từ địa chỉ của đối số cuối cùng được đặt tên trước "...", Bây giờ tôi nghĩ rằng có thể sao chép giá trị mục vectơ vào khối bộ nhớ (ví dụ: myMemBlock) và chuyển địa chỉ của nó làm đối số thứ hai sau 'định dạng'. Rõ ràng điều đó sẽ yêu cầu myMemBlock phải được cấu trúc như mong đợi bởi f(), tức là giống như một chồng.
- Điều đó có thể thực hiện được không?
- Cách khác, có thể đẩy giá trị mục vectơ lên ngăn xếp thực bằng một số ma thuật lắp ráp nội tuyến, chức năng gọi f() và dọn dẹp ngăn xếp sau đó không?
Cuối cùng, điều tôi không quan tâm đến:
- Mã này có thể là không cầm tay. OK Tôi chỉ quan tâm đến gcc.
- Có thể có các cách tiếp cận khác liên quan đến hackery tiền xử lý.
- Sử dụng hàm variadic để định dạng như printf(), không được khuyến khích cho C++.
- Cách sử dụng các hàm mẫu của hàm VARdic.
Từ những gì tôi biết, không thể "giả mạo" danh sách va_arg của riêng bạn. Những gì bạn có thể làm là truyền trực tiếp véc-tơ bằng cách quá tải hàm f() của bạn. – Gui13
Tôi không muốn thực hiện lại va_arg, tôi chỉ muốn bắt chước một ngăn xếp cho va_arg để hoạt động. – user1142580