C 함수의 데이터 저장소 (Hazelcast)에 대한 액세스를 제공하는 C ++ API를 래핑하여 데이터 저장소를 C 전용 코드에서 액세스 할 수도 있습니다.
맵 데이터 구조를위한 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
유형 꽤 많은 코드의 양을 증가 시키며, 내가 코드를 생성하는 좋은 아이디어라고 생각하지만, 그것은 코드 생성 인프라의 어떤 종류를 만들 필요하여 추가 복잡성을 추가합니다.
내가 상상할 수있는 또 다른 아이디어는 C의 일반적인 함수입니다.
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);
이것은 코드에서 올바른 전문화를 얻는 부담을 옮기기 때문에 호출자에게 조금 더 쉬워 지지만 유형 안전을 잃고 캐스트가 필요합니다. 또한 in void *
의 유형 을 전달하기 위해 이제와의 유형 key
과 value
마찬가지로 (void *) (intptr_t) intVal
호출자 측에 캐스트 가 필요하므로 다시 읽고 유지 관리하는 것이 좋지 않습니다.
- 인식 할 수없는 세 번째 옵션이 있습니까?
- C 개발자가 선호하는 버전은 무엇입니까?
헤더 파일이 상당히 커지더라도 모든 유형 조합을 자동 생성하고 각각에 대한 함수를 만드는 경향이 있습니다.