C ++ şablon türü API'sinin deyimsel kaydırma


9

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 keyve valueparametreler. 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 signedve unsignedC tiplerinin versiyonları, sadece desteklemek için API sınırlandırılması ile para cezası değilim int, double, float, char *için keyve 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, containsolası tüm kombinasyonları ile keyve valuetipleri 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 keyve valuebenzeri dökme (void *) (intptr_t) intValtekrar 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.


Birçok upvotes, henüz bir görüş yok. Ben C şablon yaygın yöntemleri sarmak için ortak bir sorun toplamak?
Maks

Yaygın olduğundan emin değilim. Sorunu ilginç bulduğum için iptal ettim.
MetaFight

Bununla ilgili, burada gerçekten yararlı olmasa da: stackoverflow.com/questions/1588788/…
Martin Ba

Yanıtlar:


1

Tüm olasılıklar için üretim yapmak benim için çok iyi bir çözüm gibi görünmüyordu. Anahtar ve değerler de nesne olabilir. Dolayısıyla olasılıklar sınırsızdır :(

IMapImpl sınıfına baktınız mı? Bu sınıf, türleri değil (serileştirmeden sonra sağlanan) ikili verileri kullanır. Bu nedenle, başka bir çözüm, bu arabirimi taklit eden bir API yazma + herhangi bir türü bu arabirimin ihtiyaç duyduğu ikili dosyaya dönüştüren bir Serileştirme yardımcı programı sağlamadır.

Örneğin

API:

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

Serileştirme yardımcı programı:

int hazelcast_binary_to_int(const Binary *data);

Desteklemek istediğiniz nesne türleri için bu yardımcı işlevleri yazmanız gerekebilir. Bu uygun bir arayüz olabilir. Bellek yönetimi gibi dikkate alınması gereken şeyler vardır.

Serileştirme karmaşık bir konudur, ancak ilk önce ilkel türleri desteklemeye kesinlikle başlayabilirsiniz. Bkz. Http://docs.hazelcast.org/docs/3.6/manual/html-single/index.html#serialization ve https://github.com/hazelcast/hazelcast/blob/master/hazelcast/src/main/java /com/hazelcast/internal/serialization/impl/ConstantSerializers.java serileştirme ayrıntıları için.


Bence bu benim durumum için bir yol. Döngü dışı insanlar için, aynı soruyu, bir C ++ istemcisine bir PR'de sordum github.com/hazelcast/hazelcast-cpp-client/pull/127 ve o C ++ istemcisinin koruyucusu ihsan, burada da soruma cevap vermek için.
Maksimum
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.