2012-10-03 7 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

_variadic templates_ C++ 11의 기능을 고려 했습니까? –

+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에는 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); 
    } 
} 
관련 문제