আমি জানি এই প্রশ্নটি পুরানো, তবে সি ++ 20 অবশেষে সি থেকে সি ++ এ এই বৈশিষ্ট্যটি না নিয়ে আসা পর্যন্ত এটি সমাধান করার একটি উপায় রয়েছে। এটি সমাধানের জন্য আপনি যা করতে পারেন তা হ'ল প্রারম্ভিক ম্যাক্রোগুলি স্ট্যাটিক_এসার্টগুলি ব্যবহার করে আপনার সূচনাটি বৈধ কিনা তা পরীক্ষা করে দেখুন। (আমি জানি ম্যাক্রোগুলি সাধারণত খারাপ, কিন্তু এখানে আমি অন্য কোনও উপায় দেখতে পাই না) নীচের উদাহরণ কোড দেখুন:
#define INVALID_STRUCT_ERROR "Instantiation of struct failed: Type, order or number of attributes is wrong."
#define CREATE_STRUCT_1(type, identifier, m_1, p_1) \
{ p_1 };\
static_assert(offsetof(type, m_1) == 0, INVALID_STRUCT_ERROR);\
#define CREATE_STRUCT_2(type, identifier, m_1, p_1, m_2, p_2) \
{ p_1, p_2 };\
static_assert(offsetof(type, m_1) == 0, INVALID_STRUCT_ERROR);\
static_assert(offsetof(type, m_2) >= sizeof(identifier.m_1), INVALID_STRUCT_ERROR);\
#define CREATE_STRUCT_3(type, identifier, m_1, p_1, m_2, p_2, m_3, p_3) \
{ p_1, p_2, p_3 };\
static_assert(offsetof(type, m_1) == 0, INVALID_STRUCT_ERROR);\
static_assert(offsetof(type, m_2) >= sizeof(identifier.m_1), INVALID_STRUCT_ERROR);\
static_assert(offsetof(type, m_3) >= (offsetof(type, m_2) + sizeof(identifier.m_2)), INVALID_STRUCT_ERROR);\
#define CREATE_STRUCT_4(type, identifier, m_1, p_1, m_2, p_2, m_3, p_3, m_4, p_4) \
{ p_1, p_2, p_3, p_4 };\
static_assert(offsetof(type, m_1) == 0, INVALID_STRUCT_ERROR);\
static_assert(offsetof(type, m_2) >= sizeof(identifier.m_1), INVALID_STRUCT_ERROR);\
static_assert(offsetof(type, m_3) >= (offsetof(type, m_2) + sizeof(identifier.m_2)), INVALID_STRUCT_ERROR);\
static_assert(offsetof(type, m_4) >= (offsetof(type, m_3) + sizeof(identifier.m_3)), INVALID_STRUCT_ERROR);\
// Create more macros for structs with more attributes...
তারপরে আপনার কাছে কনস্ট বৈশিষ্ট্য সহ কোনও কাঠামো থাকে, আপনি এটি করতে পারেন:
struct MyStruct
{
const int attr1;
const float attr2;
const double attr3;
};
const MyStruct test = CREATE_STRUCT_3(MyStruct, test, attr1, 1, attr2, 2.f, attr3, 3.);
এটি কিছুটা অসুবিধাজনক, কারণ আপনার প্রতিটি সম্ভাব্য সংখ্যার জন্য ম্যাক্রোগুলি প্রয়োজন এবং আপনাকে ম্যাক্রো কলে আপনার উদাহরণের ধরণ এবং নামটি পুনরাবৃত্তি করতে হবে। এছাড়াও আপনি কোনও রিটার্ন বিবৃতিতে ম্যাক্রো ব্যবহার করতে পারবেন না, কারণ জোর দেওয়া সূচনা করার পরে আসে।
তবে এটি আপনার সমস্যার সমাধান করে: আপনি যখন স্ট্রাক্টটি পরিবর্তন করেন, কলটি সংকলন-সময়ে ব্যর্থ হবে।
আপনি যদি সি ++ 17 ব্যবহার করেন তবে আপনি একই ধরণের জোর করে এই ম্যাক্রোগুলিকে আরও কঠোর করে তুলতে পারেন, যেমন:
#define CREATE_STRUCT_3(type, identifier, m_1, p_1, m_2, p_2, m_3, p_3) \
{ p_1, p_2, p_3 };\
static_assert(offsetof(type, m_1) == 0, INVALID_STRUCT_ERROR);\
static_assert(offsetof(type, m_2) >= sizeof(identifier.m_1), INVALID_STRUCT_ERROR);\
static_assert(offsetof(type, m_3) >= (offsetof(type, m_2) + sizeof(identifier.m_2)), INVALID_STRUCT_ERROR);\
static_assert(typeid(p_1) == typeid(identifier.m_1), INVALID_STRUCT_ERROR);\
static_assert(typeid(p_2) == typeid(identifier.m_2), INVALID_STRUCT_ERROR);\
static_assert(typeid(p_3) == typeid(identifier.m_3), INVALID_STRUCT_ERROR);\