2012-02-17 29 views
6

Tôi có chức năng A(...)B(...). Bây giờ tôi phải gọi B bên trong A, bất kỳ phương pháp nào để chuyển số ... đó từ A vào B? Mã Pseudocode:Quá trình va_args bằng C++

void A(...) 
{ 
    // Some operators 
    B(...); // Instead of ... I need to pass A's args 
} 

p.s. Tôi biết điều này có thể được thực hiện bằng cách sử dụng macro nhưng những gì về chức năng.

Trả lời

7

Bạn không thể chuyển tiếp va_args. Bạn chỉ có thể chuyển tiếp va_list.

void vB(int first, va_list ap) 
{ 
    // do stuff with ap. 
} 

void B(int first, ...) 
{ 
    va_list ap; 
    va_start(ap, first); 
    vB(first, ap); 
    va_end(ap); 
} 

void A(int something_else, int first, ...) 
{ 
    va_list ap; 
    va_start(ap, first); 
    vB(first, ap);  // <-- call vB instead of B. 
    va_end(ap); 
} 

(. Đây cũng là lý do tại sao các chức năng như vprintf tồn tại)


Nếu bạn đang sử dụng C++ 11, bạn có thể làm điều này với các mẫu variadic với chuyển tiếp hoàn hảo:

template <typename... T> 
void A(T&&... args) 
{ 
    B(std::forward<T>(args)...); 
} 
2

Thật không may là bạn không thể chụp va-list và chuyển nó đến một hàm chấp nhận danh sách đối số biến. Không có cú pháp cho phép bạn mở rộng cấu trúc va_args trở lại thành các tham số.

Bạn có thể chuyển nó dưới dạng va_list trong một tham số duy nhất, do đó, một giải pháp sẽ là xác định hàm thực hiện công việc như chụp va_list. Sau đó, bạn có thể định nghĩa một hàm khác bao bọc nó lấy một danh sách đối số, sau đó có thể chuyển một hàm va_list đến hàm lõi và chuyển giá trị trả về. Bạn thấy loại mẫu này trong thư viện chuẩn C với printf()vprintf() và các cặp tương tự.

1

Bạn cần thay đổi chút ít chữ ký của các phương pháp của mình. Tôi cho rằng bạn muốn làm một việc như sau:

void B(int numParams, va_list parameters) 
{ 
    // Your code here. Example: 
    for (int i=0; i<numParams; i++) 
    { 
     // Do something using va_arg to retrieve your parameters 
    } 
} 

void A(int numParams, ...) 
{ 
    va_list parameters; 
    va_start(parameters, numParams); 
    B(numParams, parameters); 
    va_end(parameters); 
} 
Các vấn đề liên quan