সি তে সি ++ টেম্পলেট টাইপ এপিআই এর আইডেম্যাটিক মোড়ক


9

আমি একটি সি ++ এপিআই মোড়ানোর কাজ করছি যা সি ফাংশনগুলিতে একটি ডেটা স্টোর (হ্যাজেলকাস্ট) অ্যাক্সেস সরবরাহ করে, যাতে ডেটা স্টোরটিও কেবল সি-কোড থেকে অ্যাক্সেস করা যায়।

মানচিত্রের ডেটাস্ট্রাকচারের জন্য হ্যাজেলকাস্ট সি ++ এপিআই দেখতে এই রকম দেখাচ্ছে:

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, কলারদের পক্ষের মতো একটি কাস্ট প্রয়োজন হবে, যা আবার পড়তে এবং বজায় রাখতে খুব সুন্দর নয়।

  • কোন তৃতীয় বিকল্প আছে, যা আমি চিনতে পারি না?
  • সি বিকাশকারীরা কোন সংস্করণ পছন্দ করবেন?

আমি বেশিরভাগ ক্ষেত্রে সমস্ত ধরণের সংমিশ্রণগুলি স্বয়ংক্রিয়ভাবে উত্পন্ন করতে এবং প্রতিটিটির জন্য একটি ফাংশন তৈরি করতে আগ্রহী, যদিও শিরোনাম ফাইলটি আমার ধারণা হিসাবে যথেষ্ট বিশাল হয়ে উঠবে।


অনেক upvotes, এখনও কোন মতামত। আমি জড়ো করি এটি একটি সাধারণ সমস্যা কীভাবে সিটিতে টেমপ্লেট টাইপ করা পদ্ধতিগুলি মোড়ানো যায়?
সর্বোচ্চ

আমি নিশ্চিত না যে এটি সাধারণ বিষয়। আমি উত্সাহিত করেছি কারণ আমি সমস্যাটিকে আকর্ষণীয় বলে মনে করি।
মেটাফাইট

সম্পর্কিত, যদিও এখানে সত্যিকারের মতো সমস্ত সহায়ক নয়: stackoverflow.com/questions/1588788/…
মার্টিন বা

উত্তর:


1

সমস্ত সম্ভাবনার জন্য উত্পন্ন করা আমার কাছে খুব ভাল সমাধান বলে মনে হয়নি। কী এবং মানগুলিও বস্তু হতে পারে। সুতরাং, সম্ভাবনাগুলি অসীম :(

আপনি কি আইএমএপিআইএমপিএল ক্লাসটি দেখেছেন? এই শ্রেণিটি ধরণগুলি ব্যবহার করে না তবে বাইনারি ডেটা (যা সিরিয়ালের পরে সরবরাহ করা হয়)। অতএব, অন্য সমাধানে এমন একটি এপিআই লেখা হবে যা এই ইন্টারফেসটিকে অনুকরণ করে + একটি সিরিয়ালাইজেশন ইউটিলিটি সরবরাহ করে যা এই ইন্টারফেসটির প্রয়োজনীয় কোনও বাইনারিতে রূপান্তর করে।

যেমন

এপিআই:

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

সিরিয়ালাইজেশন ইউটিলিটি:

int hazelcast_binary_to_int(const Binary *data);

আপনি সমর্থন করতে চান এমন অবজেক্টের ধরণের জন্য আপনাকে এই সহায়ক ফাংশনগুলি লেখার প্রয়োজন হতে পারে। এটি একটি কার্যকর ইন্টারফেস হতে পারে। মেমরি পরিচালনার মতো কিছু বিষয় বিবেচনা করা উচিত।

সিরিয়ালাইজেশন একটি জটিল বিষয়, তবে আপনি অবশ্যই প্রথম প্রকারভেদকে সমর্থন করে শুরু করতে পারেন। দেখুন http://docs.hazelcast.org/docs/3.6/manual/html-single/index.html#serialization এবং https://github.com/hazelcast/hazelcast/blob/master/hazelcast/src/main/java ক্রমিকায়নের বিশদগুলির জন্য / কম্বল / হেজেলকাস্ট / আন্তঃনীতি / বিচারিকরণ / আইপিএল / কনস্ট্যান্টসরিয়ালাইজার্স.জভা


আমি মনে করি এটিই আমার মামলার পক্ষে যাওয়ার উপায়। লুপ থেকে দূরে থাকা লোকদের জন্য, আমি হ্যাজলকাস্ট সি ++ ক্লায়েন্ট github.com/hazelcast/hazelcast-cpp-client/pull/127 এবং একটি সিআর ++ ক্লায়েন্টের রক্ষণাবেক্ষণকারী, আহসানকেও একই প্রশ্ন জিজ্ঞাসা করেছি এখানেও আমার প্রশ্নের জবাব দিতে।
সর্বোচ্চ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.