এর ব্যবহার বুস্ট :: প্রিপ্রোসেসর নীচের মত একটি মার্জিত সমাধান সম্ভব করে তোলে:
পদক্ষেপ 1: শিরোলেখ ফাইলটি অন্তর্ভুক্ত করুন:
#include "EnumUtilities.h"
পদক্ষেপ 2: নিম্নলিখিত সিনট্যাক্সের সাথে গণনা অবজেক্টটি ঘোষণা করুন:
MakeEnum( TestData,
(x)
(y)
(z)
);
পদক্ষেপ 3: আপনার ডেটা ব্যবহার করুন:
উপাদানের সংখ্যা পাওয়া:
td::cout << "Number of Elements: " << TestDataCount << std::endl;
সম্পর্কিত স্ট্রিং পাওয়া:
std::cout << "Value of " << TestData2String(x) << " is " << x << std::endl;
std::cout << "Value of " << TestData2String(y) << " is " << y << std::endl;
std::cout << "Value of " << TestData2String(z) << " is " << z << std::endl;
সম্পর্কিত স্ট্রিং থেকে এনাম মান পাওয়া:
std::cout << "Value of x is " << TestData2Enum("x") << std::endl;
std::cout << "Value of y is " << TestData2Enum("y") << std::endl;
std::cout << "Value of z is " << TestData2Enum("z") << std::endl;
এতে কোনও অতিরিক্ত ফাইল অন্তর্ভুক্ত না করে এটি পরিষ্কার এবং কমপ্যাক্ট দেখাচ্ছে। এনাম ইউটিলিটিস-এর মধ্যে আমি যে কোডটি লিখেছি তা নিম্নলিখিত:
#include <boost/preprocessor/seq/for_each.hpp>
#include <string>
#define REALLY_MAKE_STRING(x) #x
#define MAKE_STRING(x) REALLY_MAKE_STRING(x)
#define MACRO1(r, data, elem) elem,
#define MACRO1_STRING(r, data, elem) case elem: return REALLY_MAKE_STRING(elem);
#define MACRO1_ENUM(r, data, elem) if (REALLY_MAKE_STRING(elem) == eStrEl) return elem;
#define MakeEnum(eName, SEQ) \
enum eName { BOOST_PP_SEQ_FOR_EACH(MACRO1, , SEQ) \
last_##eName##_enum}; \
const int eName##Count = BOOST_PP_SEQ_SIZE(SEQ); \
static std::string eName##2String(const enum eName eel) \
{ \
switch (eel) \
{ \
BOOST_PP_SEQ_FOR_EACH(MACRO1_STRING, , SEQ) \
default: return "Unknown enumerator value."; \
}; \
}; \
static enum eName eName##2Enum(const std::string eStrEl) \
{ \
BOOST_PP_SEQ_FOR_EACH(MACRO1_ENUM, , SEQ) \
return (enum eName)0; \
};
কিছু সীমাবদ্ধতা রয়েছে, যেমন উত্সাহিত :: প্রাকপ্রসেসর। এই ক্ষেত্রে, ধ্রুবকের তালিকা 64 টি উপাদানের চেয়ে বড় হতে পারে না।
একই যুক্তি অনুসরণ করে, আপনি বিরল এনাম তৈরি করতেও ভাবতে পারেন:
#define EnumName(Tuple) BOOST_PP_TUPLE_ELEM(2, 0, Tuple)
#define EnumValue(Tuple) BOOST_PP_TUPLE_ELEM(2, 1, Tuple)
#define MACRO2(r, data, elem) EnumName(elem) EnumValue(elem),
#define MACRO2_STRING(r, data, elem) case EnumName(elem): return BOOST_PP_STRINGIZE(EnumName(elem));
#define MakeEnumEx(eName, SEQ) \
enum eName { \
BOOST_PP_SEQ_FOR_EACH(MACRO2, _, SEQ) \
last_##eName##_enum }; \
const int eName##Count = BOOST_PP_SEQ_SIZE(SEQ); \
static std::string eName##2String(const enum eName eel) \
{ \
switch (eel) \
{ \
BOOST_PP_SEQ_FOR_EACH(MACRO2_STRING, _, SEQ) \
default: return "Unknown enumerator value."; \
}; \
};
এই ক্ষেত্রে বাক্য গঠনটি হ'ল:
MakeEnumEx(TestEnum,
((x,))
((y,=1000))
((z,))
);
ব্যবহারটি উপরের মতোই (বিয়োগফল ই-নেম ## 2 এনিম ফাংশন, আপনি আগের বাক্য গঠন থেকে এক্সট্রোপোলেট করার চেষ্টা করতে পারেন)।
আমি এটি ম্যাক এবং লিনাক্সে পরীক্ষা করেছি, তবে সচেতন হতে হবে যে বুস্ট :: প্রিপ্রোসেসর পুরোপুরি পোর্টেবল হতে পারে না।