ฉันกำลังทำงานกับการห่อ C ++ API ซึ่งให้การเข้าถึงแหล่งข้อมูล (Hazelcast) ในฟังก์ชัน C เพื่อให้ที่เก็บข้อมูลสามารถเข้าถึงได้จากรหัส C เท่านั้น
Hazelcast C ++ API สำหรับโครงสร้างข้อมูลแผนที่มีลักษณะดังนี้:
auto map = hazelcastClient->client->getMap<int, string>(mapName);
map.put(key, value);
มันใช้ประโยชน์จากประเภทแม่แบบkey
และvalue
พารามิเตอร์ เนื่องจากไม่มีเทมเพลตใน C ฉันจึงคิดเกี่ยวกับการสร้างฟังก์ชั่น wrapper สำหรับแต่ละความเชี่ยวชาญของ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);
สิ่งนี้ทำให้ผู้โทรง่ายขึ้นเนื่องจากเป็นการเปลี่ยนภาระในการรับความเชี่ยวชาญที่ถูกต้องในรหัสของฉัน แต่มันลดความปลอดภัยของประเภทและต้องปลดเปลื้อง นอกจากนี้สำหรับการผ่าน int เช่นเดียวกับvoid *
ตอนนี้ประเภทของkey
และvalue
นักแสดงที่ต้องการ(void *) (intptr_t) intVal
จะต้องอยู่ด้านการโทรซึ่งอีกครั้งไม่ดีมากที่จะอ่านและบำรุงรักษา
- มีตัวเลือกที่สามซึ่งฉันจำไม่ได้หรือไม่
- นักพัฒนา C รุ่นใดที่เป็นที่ต้องการ
ฉันมักจะสร้างชุดค่าผสมทุกประเภทโดยอัตโนมัติและสร้างฟังก์ชั่นสำหรับแต่ละชุดแม้ว่าไฟล์ส่วนหัวจะค่อนข้างใหญ่