Ben de veri deposu da sadece C kodu erişilebilir böylece C işlevlerinde bir veri deposu (Hazelcast) erişim sağlayan bir C ++ API kaydırma üzerinde çalışıyorum.
Harita veri yapısı için Hazelcast C ++ API'si şuna benzer:
auto map = hazelcastClient->client->getMap<int, string>(mapName);
map.put(key, value);
Bu şablon için türlerinden yararlanır key
ve value
parametreler. C kullanılabilir hiçbir şablonlar gibi, getMap<T, U>
yöntemin her uzmanlık için bir sarıcı işlevi oluşturma hakkında düşündüm . Yani, her C tipi için. Orada olduğunun farkında olmama rağmen signed
ve unsigned
C tiplerinin versiyonları, sadece desteklemek için API sınırlandırılması ile para cezası değilim int
, double
, float
, char *
için key
ve value
.
Bu yüzden tüm kombinasyonları otomatik olarak oluşturan küçük bir senaryo yazdım. Dışa aktarılan işlevler şöyle görünür:
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
);
...
İçin bir işlev oluşturma get
, set
, contains
olası tüm kombinasyonları ile key
ve value
tipleri oldukça çok kod miktarını arttırır ve ben kodu oluşturulurken iyi bir fikir olduğunu düşünüyorum rağmen, kod üreten altyapı çeşit oluşturmak zorunda ek karmaşıklık ekler.
Hayal edebileceğim başka bir fikir, C'deki genel bir işlevdir, şöyle:
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
);
Hangi böyle kullanılabilir:
Hazelcast_Map_put(client, mapName, "key", API_TYPE_STR, "val", API_TYPE_STR, &err);
Bu, arayan için biraz daha kolay hale getirir, çünkü kodumda doğru uzmanlığı alma yükünü değiştirir, ancak tip güvenliğini kaybeder ve dökümler gerektirir. Ayrıca, bir int geçen üzere, hem void *
şimdi türüdür key
ve value
benzeri dökme (void *) (intptr_t) intVal
tekrar okumak ve korumak için süper güzel değil arayanlar tarafında, üzerinde gerekli olacaktır.
- Tanımadığım üçüncü bir seçenek var mı?
- C geliştiricileri tarafından hangi sürüm tercih edilir?
Herhalde tüm tür kombinasyonlarını otomatik olarak oluşturmaya ve her biri için bir işlev oluşturmaya meyilliyim, ancak başlık dosyası sanırım oldukça büyük olacak.