1

3つの引数を取る関数があります。他の関数のベクトル、void *、および引数の任意のリスト。この関数は、void *と任意の引数のリストを、関数が処理するリスト内の各関数に渡すように設計されています。これが私が欲しいものの例です:

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

すべての引数を各関数に転送する方法を知る必要があります。互換性の確保について心配する必要はありません。私はそれを他の場所で扱います。

ありがとう

4

3 に答える 3

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);
}
于 2012-10-03T15:58:23.313 に答える
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 );
    }
}
于 2012-10-03T16:01:34.013 に答える
1

C++11では可変個引数テンプレートと完全な転送を使用する必要があります。

あなたがそれを持っていないなら、AFAIKはあなたのためにそれらを模倣するBoostライブラリがあります。

于 2012-10-03T15:56:31.620 に答える