2012-10-03 79 views
1

我有一個函數需要3個參數。一個其他函數的向量,一個void *和一個任意的參數列表。該函數設計爲將void *和任意參數列表傳遞給列表中的每個函數,函數將處理它們自己。這裏是我想要的一個例子:C++:將任意數量的參數傳遞給另一個函數

typedef void (*fptr)(const void* userdata, ...); 

void execute_all(vector<fptr> funcs, void* userdata, ...){ 
    for (int i = 0;i<funcs.size();i++){ 
     fptr func = funcs[i]; 
     //execute func with userdata and ... from above. 
     //like (*func)(userdata, ...); which obviously doesnt work 
    } 
} 

我需要知道如何將所有參數轉發到每個功能。不要擔心確保兼容性。我在其他地方處理。

謝謝

+1

你有沒有考慮C++ 11的_variadic templates_特性? –

+1

@ user1629821我不相信我能假設C++ 11安裝在目標機器上 – ewok

+0

你的意思是說每個函數都是用相同的參數執行的嗎? –

回答

3

您不能直接將可變參數從可變參數傳遞到另一可變參數函數。但是,您可以使得被叫(內部)函數接受一個va_list,然後圍繞傳遞名單:

#include <cstdarg> 

void callee(void *first, va_list args); 

void caller(void *first, ...) 
{ 
    va_list args; 
    va_start(args, first); 
    callee(first, args); 
    va_end(args); 
} 
1

您應該在C++ 11中使用可變參數模板和完美的轉發。

如果您沒有這些,AFAIK還有一個Boost庫,可以爲您模擬這些庫。

2

有沒有辦法可以有效地移動一個可變參數函數的參數傳遞給另一個函數,但是您可以移動你的堆棧到另一個函數,所以它可以從堆棧本身偷看參數。 Ansi C僅爲此目的引入va_list。你可以有以下代碼:

void fwd_function(int argCount, ...) { 
    va_list vargs; 
    va_start(vargs, argCount); 
    impl_function(argCount, vargs); 
    va_end(vargs); 
} 
void impl_function(int argCount, va_list args) { 
    int i; 
    for(i = 0; i < argCount; i++) { 
     int arg = va_arg(args, int); 
    } 
} 
相關問題