2012-02-17 9 views
6

Mam funkcję A(...) i B(...). Teraz muszę zadzwonić pod numer B wewnątrz A, dowolne metody przekazywania tego ... z do B? Pseudokod:Proces va_args w C++

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

p.s. Wiem, że można to zrobić za pomocą makr, ale co z funkcjami.

Odpowiedz

7

Nie można przekazać va_args. Możesz tylko przesłać dalej 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); 
} 

(. Jest to również, dlaczego istnieje takie funkcje jak vprintf)


Jeśli używasz C++ 11, można to zrobić przy zmiennej liczbie argumentów szablonów z doskonałej korespondencji:

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

Niestety, nie można pobrać va-list i przekazać go do funkcji przyjmującej listę zmiennych zmiennych. Nie ma żadnej składni umożliwiającej rozwinięcie struktury va_args z powrotem do parametrów.

Możesz przekazać to jako va_list w jednym parametrze, więc jednym rozwiązaniem byłoby zdefiniowanie funkcji, która wykonuje pracę jako przyjmującą va_list. Następnie możesz zdefiniować inną funkcję owijającą ją, pobierając listę argumentów, która może następnie przekazać va_list do funkcji rdzenia i przekazać wartość zwracaną z powrotem. Ten typ wzorca występuje w bibliotece standardowej C z printf() i vprintf() i podobnymi parami.

1

Musisz nieznacznie zmienić sygnaturę swoich metod. Zakładam, że chcesz zrobić coś takiego:

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); 
}