मैं C ++ API लपेटने पर काम कर रहा हूं जो C फ़ंक्शन में डेटा स्टोर (हेज़ेलकास्ट) तक पहुंच प्रदान करता है, ताकि डेटा स्टोर को सी-ओनली कोड से भी एक्सेस किया जा सके।
मैप डेटास्ट्रक्चर के लिए हेज़ेलकास्ट सी ++ एपीआई इस तरह दिखता है:
auto map = hazelcastClient->client->getMap<int, string>(mapName);
map.put(key, value);
यह मापदंडों key
और value
मापदंडों के प्रकार का उपयोग करता है । चूंकि सी में कोई टेम्पलेट उपलब्ध नहीं हैं, इसलिए मैंने getMap<T, U>
विधि के प्रत्येक विशेषज्ञता के लिए एक आवरण समारोह बनाने के बारे में सोचा । यही है, प्रत्येक सी प्रकार के लिए। हालांकि मुझे पता है देखते हैं कि कर रहा हूँ signed
और unsigned
सी प्रकार के संस्करणों, मैं एपीआई सीमित ही समर्थन करने के लिए के साथ ठीक हूँ 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
प्रकार के कोड की मात्रा काफी एक बहुत बढ़ जाती है, और हालांकि मुझे लगता है कि कोड जनरेट एक अच्छा विचार है, यह कोड पैदा करने के बुनियादी ढांचे के कुछ प्रकार बनाने के लिए होने से अतिरिक्त जटिलता कहते हैं।
एक और विचार मैं कल्पना कर सकता हूं कि सी में एक सामान्य कार्य है, जैसे:
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);
इससे कॉल करने वाले के लिए थोड़ा आसान हो जाता है, क्योंकि यह मेरे कोड पर सही विशेषज्ञता प्राप्त करने के बोझ को बदल देता है, लेकिन यह प्रकार की सुरक्षा खो देता है और इसके लिए कलाकारों की आवश्यकता होती है। इसके अलावा, एक इंट में पास होने के लिए, जैसा void *
कि अब टाइप है key
और value
, (void *) (intptr_t) intVal
कॉलर्स की तरह एक कास्ट की आवश्यकता होगी, जो फिर से पढ़ने और बनाए रखने के लिए सुपर अच्छा नहीं है।
- क्या कोई तीसरा विकल्प है, जिसे मैं नहीं पहचान सकता?
- सी डेवलपर्स द्वारा कौन सा संस्करण पसंद किया जाएगा?
मैं ज्यादातर सभी प्रकार के संयोजनों को ऑटो-जेनरेट करने और प्रत्येक के लिए एक फ़ंक्शन बनाने के लिए इच्छुक हूं, हालांकि हेडर फ़ाइल काफी विशाल हो जाएगी, मुझे लगता है।