Tôi đang nghiên cứu gói API C ++ cung cấp quyền truy cập vào kho lưu trữ dữ liệu (Hazelcast) trong các hàm C, để lưu trữ dữ liệu cũng có thể được truy cập từ mã chỉ C.
API Hazelcast C ++ cho cơ sở hạ tầng bản đồ trông như thế này:
auto map = hazelcastClient->client->getMap<int, string>(mapName);
map.put(key, value);
Nó sử dụng các kiểu mẫu cho key
và value
tham số. Vì không có mẫu nào có sẵn trong C, tôi nghĩ về việc tạo một hàm bao cho mỗi chuyên môn hóa của getMap<T, U>
phương thức. Đó là, cho mỗi loại C. Mặc dù tôi biết rằng có những signed
và unsigned
các phiên bản của loại C, tôi tốt với giới hạn API để hỗ trợ chỉ int
, double
, float
, char *
cho key
và value
.
Vì vậy, tôi đã viết một kịch bản nhỏ, tự động tạo ra tất cả các kết hợp. Các hàm xuất như thế này:
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
);
...
Tạo một hàm cho get
, set
, contains
với tất cả các kết hợp có thể có của key
và value
các loại tăng số lượng mã khá nhiều, và mặc dù tôi nghĩ tạo mã là một ý tưởng tốt, nó sẽ thêm phức tạp thêm bởi phải tạo ra một số loại cơ sở hạ tầng mã tạo.
Một ý tưởng khác tôi có thể tưởng tượng là một hàm chung trong C, như thế này:
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
);
Mà có thể được sử dụng như thế này:
Hazelcast_Map_put(client, mapName, "key", API_TYPE_STR, "val", API_TYPE_STR, &err);
Điều này làm cho người gọi dễ dàng hơn một chút, bởi vì nó thay đổi gánh nặng của việc chuyên môn hóa chính xác về mã của tôi, nhưng nó mất an toàn kiểu và yêu cầu phôi. Ngoài ra, để chuyển qua một int, như void *
bây giờ là kiểu key
và value
, cần một diễn viên như thế (void *) (intptr_t) intVal
ở phía người gọi, điều này một lần nữa không hay để đọc và duy trì.
- Có lựa chọn thứ ba nào mà tôi không thể nhận ra không?
- Phiên bản nào sẽ được các nhà phát triển C ưa thích?
Tôi hầu như có xu hướng tự động tạo tất cả các kết hợp loại và tạo một chức năng cho từng loại, mặc dù tôi cho rằng tệp tiêu đề sẽ trở nên khá lớn.