Gói thành ngữ API loại mẫu C ++ trong C


9

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 keyvaluetham 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 signedunsignedcá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 keyvalue.

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, containsvới tất cả các kết hợp có thể có của keyvaluecá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 keyvalue, 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.


Nhiều upvote, chưa có ý kiến. Tôi tập hợp nó là một vấn đề phổ biến làm thế nào để bọc các phương thức gõ mẫu trong C?
Tối đa

Tôi không chắc nó phổ biến. Tôi ủng hộ vì tôi thấy vấn đề thú vị.
MetaFight

Liên quan, mặc dù không thực sự hữu ích ở đây: stackoverflow.com/questions/1588788/NH
Martin Ba

Câu trả lời:


1

Tạo ra cho tất cả các khả năng có vẻ không phải là một giải pháp rất tốt cho tôi. Khóa và giá trị cũng có thể là đối tượng. Do đó, các khả năng là vô hạn :(

Bạn đã xem lớp IMapImpl chưa? Lớp này không sử dụng các loại mà là dữ liệu nhị phân (được cung cấp sau khi tuần tự hóa). Do đó, một giải pháp khác sẽ là viết một API bắt chước giao diện này + cung cấp tiện ích Tuần tự hóa để chuyển đổi bất kỳ loại đã cho nào thành nhị phân mà giao diện này cần.

Ví dụ

API:

struct Binary {
   byte *data;
   size_t length;
   int32_t dataType;
};
Binary *hazelcast_map_put(const Binary *key, const Binary *value);

Tiện ích nối tiếp:

int hazelcast_binary_to_int(const Binary *data);

Bạn có thể cần phải viết các hàm trợ giúp này cho các loại đối tượng mà bạn muốn hỗ trợ. Đây có thể là một giao diện khả thi. Có những thứ cần được xem xét như quản lý bộ nhớ.

Tuần tự hóa là một chủ đề phức tạp, nhưng bạn chắc chắn có thể bắt đầu với việc hỗ trợ các kiểu nguyên thủy trước tiên. Xem http://docs.hazelcast.org/docs/3.6/manual/html-single/index.html#serializationhttps://github.com/hazelcast/hazelcast/blob/master/hazelcast/src/main/java /com/hazelcast/iternal/serialization/impl/ConstantSerialulators.java để biết chi tiết tuần tự hóa.


Tôi nghĩ rằng đây là cách để đi cho trường hợp của tôi. Đối với những người không liên quan, tôi cũng đã đặt câu hỏi tương tự trong PR cho ứng dụng khách C ++ hazelcast github.com/hazelcast/hazelcast-cpp-client/pull/127 và ihsan, người duy trì ứng dụng khách C ++ đó, ​​rất tuyệt để trả lời câu hỏi của tôi ở đây trên SO, quá.
Tối đa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.