スワップ可能なハッシュ関数を使ってハッシュテーブルを定義したいと思います。ハッシュ関数は、ハッシュテーブルとハッシュされるキーへのポインターを受け取り、次のようなintを返します。
typedef int (hash_function_t) (hashtable *, int);
ここで、ハッシュテーブルには、キーのハッシュに使用される関数へのポインターが格納されます。
typedef struct ht {
size_t size;
...
hash_function_t *hash_function;
} hashtable;
残念ながら、これは循環参照を作成します。
ハッシュ関数定義にハッシュテーブルへのポインターが必要です。これにより、ハッシュテーブルのサイズに対してモジュラスを実行できるため、バケットの最大数を超えません。ハッシュ関数ポインターをあちこちに渡す必要がないように、ハッシュテーブルにハッシュ関数が必要です。
私はこれが次のようなコードにつながることを理解しています:
*ht->hash_function (ht, key)
これは少し奇妙ですが、私はそれで大丈夫です。
typedefをどちらかの順序で配置しても機能しません。ハッシュテーブルで長い定義を使用し、後でtypedefを実行する必要がありますか、それともより良い方法がありますか?
これはすべてストレートCで意図されており、C++ではありません。ANSI Cソリューションをお勧めします!