سؤال

الأكثر نضجا مشاريع C++ يبدو أن الخاصة التفكير سمة النظام, أنا.e تحديد السمات التي يمكن الوصول إليها من خلال سلسلة تلقائيا قابل للتسلسل.على الأقل العديد من مشاريع C++ شاركت في بدا إعادة اختراع العجلة.

هل تعرف أي جيد المكتبات مفتوحة المصدر C++ التي تدعم التفكير سمة الحاويات ، على وجه التحديد:

  • تحديد RTTI والصفات عبر وحدات الماكرو
  • الوصول إلى RTTI والصفات عن طريق كود
  • التلقائي التسلسل من سمات
  • الاستماع إلى السمة التعديلات (مثلOnValueChanged)
هل كانت مفيدة؟

المحلول

هل يمكن أن يكون نظرة على اثنين من الأدوات أدناه.أنا لم تستخدم أي منها, لذلك لا استطيع ان اقول لكم كيف (im)العملية هم.

XRTTI:

Xrtti هو أداة المصاحبة C++ المكتبة التي تمتد معيار نوع وقت التشغيل نظام C++ لتوفير أكثر ثراء بكثير من انعكاس المعلومات حول الفئات وأساليب التعامل مع هذه الفئات و أعضائها.

OpenC++:

OpenC++ C++ الواجهة مكتبة (lexer+محلل+DOM/MOP) و مصدر إلى مصدر الترجمة.OpenC++ تمكن التنمية C++ أدوات اللغة, ملحقات, المجال محددة مترجم التحسينات و وقت التشغيل metaobject البروتوكولات.

نصائح أخرى

هذا هو ما تحصل عليه عندما C++ يلتقي التفكير:

C++ meets Reflection

كل ما اخترت ، ربما يكون الرهيبة وحدات الماكرو من الصعب رمز التصحيح أو غريب بناء الخطوات.رأيت نظام واحد تولد تلقائيا التسلسل رمز من DevStudio هو ملف PDB.

على محمل الجد على الرغم من المشاريع الصغيرة ، سوف يكون من الأسهل لكتابة حفظ/تحميل وظائف (أو استخدام تدفق المشغلين).في الواقع ، قد يحمل على مشاريع كبيرة جدا - من الواضح ما يحدث و كنت عادة ما تحتاج إلى تغيير رمز على أي حال إذا كان هيكل التغييرات.

هناك مشروع جديد لتوفير التفكير في C++ باستخدام نهج مختلف تماما: المخيم. https://github.com/tegesoft/camp

المخيم لا يستخدم precompiler, الطبقات/خصائص/وظائف/...وأعلن يدويا باستخدام بناء الجملة مماثلة لتعزيز.الثعبان أو luabind.بالطبع, يمكن للناس استخدام precompiler مثل gccxml أو مفتوحة-c++ لتوليد هذا الإعلان إذا كانوا يفضلون ذلك.

أنها تقوم على محض C++ وزيادة رؤوس فقط ، بفضل قوة قالب الفوقية البرمجة وهو يدعم أي نوع من bindable الكيان (الميراث و غريبة منشئات ليست مشكلة ، على سبيل المثال).

يتم توزيعه تحت رخصة MIT (سابقا LGPL).

نظرت إلى هذه الأشياء لفترة طويلة لكنها تميل إلى أن تكون ثقيلة جدا الوفاض.قد تمنعك من استخدام الميراث ، أو وجود غريب منشئات الخ الخ.في النهاية انتهى الأمر يجري الكثير من العبء بدلا من الراحة.

هذا النهج من أجل فضح أعضاء أنني الآن استخدام جدا خفيف الوزن يتيح لك استكشاف فئة على التسلسل أو وضع جميع المجالات يسمى "x" إلى 0 ، على سبيل المثال.وهو أيضا ثابت العزم لذلك هو جدا سريع جدا.لا طبقات من مكتبة رمز أو رمز-gen للقلق بشأن العبث مع عملية الإنشاء.فإنه generalises إلى الهرمية المتداخلة أنواع.

تعيين محرر مع بعض وحدات ماكرو لأتمتة كتابة بعض من هذه الأمور.

struct point
{
     int x;
     int y;

     // add this to your classes
     template <typename Visitor>
     void visit(Visitor v)
     {
         v->visit(x, "x"); 
         v->visit(y, "y");
     }
};


/** Outputs any type to standard output in key=value format */
struct stdout_visitor
{
     template <typename T>
     void visit(const T& rhs)
     {
         rhs.visit(this);
     }

     template <typename Scalar>
     void visit (const Scalar& s, const char* name)
     {
          std::cout << name << " = " << s << " ";
     }
}

بحثت في هذا الوقت أيضا.الحالي أسهل حل يبدو أن BOOST_FUSION_ADAPT_STRUCT.عمليا مرة واحدة لديك مكتبة/رأس تحتاج فقط إلى إضافة البنية الحقول في BOOST_FUSION_ADAPT_STRUCT() الكلي ، الجزء الأخير من التعليمات البرمجية يظهر.نعم فقد القيود العديد من الأشخاص الآخرين قد ذكر.وأنه لا يدعم المستمعين مباشرة.

غيرها من الحلول الواعدة نظرت الى

  • مخيم XRTTI/gccxml ذلك يبدو أن عقبة لجلب أدوات خارجية التبعية إلى المشروع الخاص بك.
  • قبل سنوات كنت perl c2ph/pstruct تفريغ المعلومات الوصفية من إخراج gcc -gstabs, هذا هو أقل تطفلا ولكن يحتاج الى مزيد من العمل على الرغم من انها عملت تماما بالنسبة لي.

بخصوص دفعة/__cxa النهج ، بمجرد معرفة كل التفاصيل الصغيرة, إضافة/تغيير البنيات أو الحقول بسيطة للحفاظ على.نحن نستخدم حاليا لبناء العرف أنواع ملزمة طبقة على رأس dbus تثبيت إلى تسلسل API وإخفاء النقل/RPC تفاصيل كائن مدار الخدمة الفرعي.

وليس واحد ولكن QT يدعم هذا عن طريق meta مترجم ، GPL.فهمي من الحديث إلى QT الناس أن هذا غير ممكن مع خالص C++, ومن هنا جاءت الحاجة إلى وزارة التجارة.

هذا هو سيئة السمعة ضعف C++ لغة في العامة لأن الأشياء التي سوف تحتاج إلى أن تكون موحدة لجعل انعكاس تطبيقات المحمولة و جديرة بالاهتمام ليست القياسية.يدعو الاتفاقيات كائن تخطيطات و رمز تغيير اسم تتبادر إلى الذهن ، ولكن هناك آخرون أيضا.

عدم وجود اتجاه من الوسائل القياسية التي مترجم منفذي سوف تفعل بعض الأشياء بشكل مختلف, وهو ما يعني أن عدد قليل جدا من الناس لديهم الدافع لكتابة المحمولة انعكاس المكتبة ، وهو ما يعني أن الناس الذين يحتاجون إلى التفكير في إعادة اختراع العجلة ، ولكن فقط ما يكفي للحصول على ما يحتاجون إليه.يحدث هذا بلا نهاية, و نحن هنا.

التلقائي التأمل/أدوات التفكير.استخدام ميتا مترجم مثل Qt و إضافة المعلومات الوصفية مباشرة إلى ملفات الكائن.بديهية وسهلة الاستخدام.لا الاعتماد على الخارج.حتى تسمح تلقائيا تعكس std::string ومن ثم استخدامها في البرامج النصية.يرجى زيارة IDK

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top