এটি সামান্য ওটি, তবে আমি ভেবেছিলাম যে এটি অন্য কাউকে সহায়তা করে যদি আমি এটি এখানে রেখে আসি। আমি এখানে টেমপ্লেট স্পেশালাইজেশন সম্পর্কে গুগল করছি যা আমাকে এখানে নিয়ে গেছে, এবং @ ম্যাক্সিম 1000 এর উত্তর সঠিক এবং শেষ পর্যন্ত আমাকে আমার সমস্যাগুলি নির্ধারণ করতে সহায়তা করেছে, তবে আমি মনে করি না এটি প্রচুর পরিমাণে পরিষ্কার ছিল।
আমার পরিস্থিতি ওপি-র তুলনায় কিছুটা আলাদা (তবে এই উত্তরটি আমি মনে করি এটি ছেড়ে দেওয়ার পক্ষে যথেষ্ট) মূলত, আমি "স্ট্যাটাসের ধরণগুলি" সংজ্ঞায়িত করে বিভিন্ন ধরণের শ্রেণির সাথে একটি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করছি। এই ধরণের হৃদয় কেবল enum
সরল, তবে ক্লাসগুলি সমস্ত সাধারণ (বিমূর্ত) পিতামাতার কাছ থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় এবং বিভিন্ন ইউটিলিটি ফাংশন সরবরাহ করে যেমন অপারেটর ওভারলোডিং এবং একটি static toString(enum type)
ফাংশন। প্রতিটি স্ট্যাটাস enum
একে অপরের থেকে আলাদা এবং সম্পর্কিত নয়। উদাহরণস্বরূপ, একটিতে enum
ক্ষেত্র রয়েছে NORMAL, DEGRADED, INOPERABLE
, অন্যের রয়েছে AVAILBLE, PENDING, MISSING
ইত্যাদি My আমার সফ্টওয়্যারটিতে বিভিন্ন উপাদানগুলির জন্য বিভিন্ন ধরণের স্ট্যাটাস পরিচালনা করার দায়িত্বে থাকে। এটি এলো যে আমি toString
এইগুলির জন্য ফাংশনগুলি ব্যবহার করতে চাইenum
ক্লাস, কিন্তু যেহেতু তারা বিমূর্ত, আমি তাদের সরাসরি ইনস্ট্যান্ট করতে পারিনি। আমি যে ক্লাসটি ব্যবহার করতে চাইছিলাম তা আমি বাড়িয়ে দিতে পারতাম, তবে শেষ পর্যন্ত আমি একটি template
ক্লাস তৈরির সিদ্ধান্ত নিয়েছিলাম , যেখানে আমি যতটা typename
কংক্রিট স্ট্যাটাসের enum
যত্ন নিই তা হবে । সম্ভবত এই সিদ্ধান্ত সম্পর্কে কিছু বিতর্ক হতে পারে, তবে আমি অনুভব করেছি যে এটি enum
আমার নিজস্ব কাস্টমটির সাথে প্রতিটি বিমূর্ত শ্রেণিকে বাড়ানো এবং বিমূর্ত ফাংশনগুলি বাস্তবায়নের চেয়ে অনেক কম কাজ ছিল । এবং অবশ্যই আমার কোডে, আমি কেবল কল করতে সক্ষম হতে চেয়েছি .toString(enum type)
এবং এটির স্ট্রিং উপস্থাপনা মুদ্রণ করতে চাই enum
। যেহেতু সমস্ত enum
গুলি সম্পূর্ণরূপে সম্পর্কিত নয়, সেগুলির প্রতিটি নিজস্ব ছিল owntoString
ফাংশনগুলি (কিছু গবেষণার পরে আমি শিখেছি) টেমপ্লেট বিশেষায়নের সাহায্যে কল করতে হয়েছিল। আমাকে এখানে নিয়ে গেছে এই কাজটি সঠিকভাবে করার জন্য আমার কী করতে হয়েছিল তার একটি এমসিভিই নীচে। এবং আসলে আমার সমাধান @ ম্যাক্সিম 1000 এর চেয়ে কিছুটা আলাদা ছিল।
এই (ব্যাপকভাবে সরলীকৃত) জন্য হেডার ফাইল enum
গুলি। বাস্তবে, প্রতিটি enum
শ্রেণি তার নিজস্ব ফাইলে সংজ্ঞায়িত হয়েছিল। এই ফাইলটি আমি যে লাইব্রেরিটি ব্যবহার করছি তার অংশ হিসাবে আমাকে সরবরাহ করা শিরোনাম ফাইলগুলি উপস্থাপন করে:
#include <string>
class Enum1
{
public:
enum EnumerationItem
{
BEARS1,
BEARS2,
BEARS3
};
static std::string toString(EnumerationItem e)
{
}
};
class Enum2
{
public:
enum EnumerationItem
{
TIGERS1,
TIGERS2,
TIGERS3
};
static std::string toString(EnumerationItem e)
{
}
};
পরবর্তী ফাইলটি একটি ভিন্ন কোড ব্লকে পৃথক করতে এই লাইনটি যুক্ত করা:
#include <string>
template <typename T>
class TemplateExample
{
public:
TemplateExample(T t);
virtual ~TemplateExample();
std::string toString();
private:
T type_;
};
template <typename T>
TemplateExample<T>::TemplateExample(T t)
: type_(t)
{
}
template <typename T>
TemplateExample<T>::~TemplateExample()
{
}
পরবর্তী ফাইল
#include <string>
#include "enums.h"
#include "TemplateExample.h"
template <>
std::string TemplateExample<Enum1::EnumerationItem>::toString()
{
return Enum1::toString(type_);
}
template <>
std::string TemplateExample<Enum2::EnumerationItem>::toString()
{
return Enum2::toString(type_);
}
পরবর্তী ফাইল
#include <iostream>
#include "TemplateExample.h"
#include "enums.h"
int main()
{
TemplateExample<Enum1::EnumerationItem> t1(Enum1::EnumerationItem::BEARS1);
TemplateExample<Enum2::EnumerationItem> t2(Enum2::EnumerationItem::TIGERS3);
std::cout << t1.toString() << std::endl;
std::cout << t2.toString() << std::endl;
return 0;
}
এবং এই ফলাফলগুলি:
BEARS1
TIGERS3
এটি আমার সমস্যা সমাধানের আদর্শ সমাধান হলে কোনও ক্লু নেই, তবে এটি আমার পক্ষে কাজ করেছে। এখন, আমি গণনার কতগুলি প্রকার toString
ব্যবহার করেই শেষ করি না কেন, আমাকে কেবলমাত্র .cpp ফাইলে পদ্ধতিটির জন্য কয়েকটি লাইন যুক্ত করতে হবে এবং আমি নিজেরাই toString
প্রয়োগ না করে এবং প্রতিটি প্রসারিত না করেই ইতিমধ্যে নির্ধারিত লাইব্রেরিগুলি ব্যবহার করতে পারি enum
ক্লাস আমি ব্যবহার করতে চাই।