C関数でデータストア(Hazelcast)へのアクセスを提供するC ++ APIのラップに取り組んでいるため、データストアはCのみのコードからもアクセスできます。
Mapデータ構造用のHazelcast C ++ APIは次のようになります。
auto map = hazelcastClient->client->getMap<int, string>(mapName);
map.put(key, value);
とテンプレートのテンプレートタイプを使用key
しvalue
ます。Cには利用可能なテンプレートがないため、getMap<T, U>
メソッドの特殊化ごとにラッパー関数を作成することを考えました。つまり、Cタイプごとに。私があることを承知しているが、signed
およびunsigned
Cタイプのバージョンは、私だけをサポートするAPIを制限して大丈夫だよint
、double
、float
、char *
のためにkey
とvalue
。
そこで、すべての組み合わせを自動生成する小さなスクリプトを書きました。エクスポートされた関数は次のようになります。
int Hazelcast_Map_put_int_string(
Hazelcast_Client_t *hazelcastClient,
const char *mapName,
int key,
char *value,
char** errptr
);
int Hazelcast_Map_put_int_int(
Hazelcast_Client_t *hazelcastClient,
const char *mapName,
int key,
int value,
char** errptr
);
...
機能の生成get
、set
、contains
すべての可能な組み合わせとkey
し、value
種類は非常に多くのコードの量を増加させ、そして、私はコードを生成することは良いアイデアだと思いますが、それはコード生成インフラのいくつかの種類を作成することによって、追加の複雑さを追加します。
私が想像できるもう1つのアイデアは、次のようなCの一般的な関数の1つです。
int Hazelcast_Map_put(
Hazelcast_Client_t *hazelcastClient,
const char *mapName,
const void *key,
API_TYPE key_type,
const void *value,
API_TYPE value_type,
char** errptr
);
これは次のように使用できます:
Hazelcast_Map_put(client, mapName, "key", API_TYPE_STR, "val", API_TYPE_STR, &err);
これにより、コードで正しい特殊化を取得する負担が軽減されるため、呼び出し元にとっては少し簡単になりますが、型の安全性が失われ、キャストが必要になります。また、intを渡すために、void *
現在のkey
and のタイプとvalue
同様(void *) (intptr_t) intVal
に、呼び出し側でキャストのようなものが必要になりますが、これもまた、読み取りと保守が非常に適切ではありません。
- 認識できない3番目のオプションはありますか?
- C開発者が好むバージョンはどれですか?
私は主にすべてのタイプの組み合わせを自動生成し、それぞれに関数を作成する傾向がありますが、ヘッダーファイルはかなり大きくなると思います。