1

私はこのようなツリートラバーサルAPIを持っています

treeTraverse(Tree *ptr, (void *) call_back(Tree *ptr));

この API はツリーを走査し、各エントリでコールバック関数を呼び出します。ツリーをトラバースして関数を呼び出したい

myFunc(Tree *ptr, int a, int b)

ツリーのすべてのエントリに対してですが、上記でわかるように、コールバック関数は 1 つの引数しか受け入れないため、myFunc() をコールバック関数として登録しても機能しません。この問題を回避するにはどうすればよいですか。

可変引数を受け入れるように treeTraverse() API を書き直すのは現実的ではありません。これはフレームワーク API であり、変更する必要がある場合は、多くの人にレビューしてもらう必要があるためです。非常に小さな機能を実装するだけでよいので、私が楽しみにしていることではありません。

もう 1 つの方法は、変数 'a' と 'b' をグローバルにして、myFunc がアクセスできるようにすることです。しかし、この解決策は非常に醜く見えます。

これを回避する他の方法はありますか?

4

1 に答える 1

3

あなたの状況を考えると、作成abグローバルは合理的な解決策のようです。ただし、スレッドまたは再帰セーフではないことに注意してください。

treeTraverseコールバックに渡される追加の引数を 1 つだけ追加できる場合は、構造体を使用して任意の数の追加の引数を渡すことができます。

void treeTraverse(Tree *ptr,
                  (void *) call_back(Tree *ptr, void *arg),
                  void *call_back_arg);
struct {
  int a;
  int b;
} args = {...};
treeTraverse(ptr, myCallback, &args);

これは、コールバックを使用するほとんどのコードの標準機能です。フレームワーク API に追加することを主張する必要があります。これははるかに優れたソリューションです。

于 2012-09-12T19:33:38.440 に答える