1

ハッシュテーブル (データのリンクされたリストへのポインターの配列) といくつかのサポート関数 (要素の挿入、テーブルの削除など) による C++ STL コンテナー マップ (連想配列) の C 実装を記述することになっていた... これらすべてを正常に記述しました。ただしforeach(table, function_ptr)、テーブル内のすべてのデータに対して渡された関数を呼び出す関数を除きます (印刷内容...)。

どのパラメーターを に渡す必要があるのか​​ わからないため、ここで少し立ち往生しているためfunction_ptr、それは普遍的です。今のところ、それは不可能だと思います。

たとえばprintfにポインタを渡したい場合は簡単です。プロトタイプは次のforeachようになります

foreach(table_t *t, int (*function_ptr)(const char *fmt, ...))

そして、このようなすべてのデータノードに対してそれを呼び出すだけです

function_ptr("%s, %d\n", node.key, node.data)

しかし、これを使用して、いつか自分の関数を渡したいという気が変わったら、caller-function と関数のコードも変更する必要がありforeachます。

このようなことを簡単に行う方法はありますか?

4

1 に答える 1

5

「任意の引数タイプ」を指定する従来の方法は、次のvoid *ようなを使用することです。

foreach(table_t *t, int (*function_ptr)(void *p))

次に、各引数 (構造体のような複雑なデータ型の場合があります) のアドレスを渡すことができ、関数はそれを適切な型にキャストできます。

struct {
  int x;
  int y;
} numbers;

// Sums the numbers in a structure
int sum(void *p) {
  numbers *n = (numbers *) p;  // Cast back to the correct type
  return n->x + n->y;
}

// Counts the number of 'a' chars in a string
int numberOfA(void *p) {
  char *s = (char *) p;
  int num = 0;
  while (s != NULL && *s != '\0') {
    if (*s == 'a') {
      ++num;
    }
  }
}
于 2012-04-22T17:15:12.463 に答える