إطار عمل إضافي لـ C ++

الدخول


من لم يزور ، باستخدام مكتبات مفتوحة المصدر ، فكر: "شكرًا لهؤلاء الرجال على هذه المكتبة الرائعة! في يوم من الأيام ، سأكتب شيئًا ذا قيمة ونضعه في مكان عام حتى يتمكن الآخرون من استخدامه! "


نعم الجميع! أم لا؟ ..


مع ظهور معيار C ++ 17 ، يتم حل لدينا بشكل أسرع وأكثر أناقة ، ما عليك سوى أن ترغب في تحقيق فكرتك ، وأن تكون قادرًا على تنفيذ الأشياء الجيدة التي يفسدنا بها الرجال من WG21 .
? : #, )) ...


الخلفية


إن موضوع المكونات الإضافية مثير للاهتمام ، لأنه يسمح لك بعمل وظائف جديدة في البرنامج (البرنامج) دون إجراء تغييرات على جوهر البرنامج ، ولكن في نفس الوقت ، يجب التفكير في واجهة التفاعل وكتابتها: Software <-> Plugins Manager <-> Plugins .


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


في إحدى لحظات التعليم الذاتي ، وقراءة المقالات على C ++ 17 ، تقرر دمج المعرفة المكتسبة عند كتابة نظام توصيل يمكن فهمه وسهل استخدامه.


كيف فعلت ذلك سيئة أو جيدة - القاضي يا عزيزي خابروفيتس ...


مراجعة


ميزات المكتبة


  • الإضافات كخدمات (تعمل في صفقات منفصلة)
  • تفريغ الإضافات غير المستخدمة تلقائيًا

الايجابيات


  • سهولة الاستخدام
  • تنفيذ مهمة غير متزامنة
  • تصميم للرأس فقط

سلبيات


  • إذا تم إدخال مكون إضافي جديد في النظام ، فيجب ترجمته مع نفس إصدار المترجم الذي يقوم المدير بتنزيله (بالإضافة إلى libstdc ++) لتوافق ABI
  • مخابئ ثابتة من std :: any إلى الأنواع المستخدمة؟
  • التحقق من صحة العقود الآجلة؟

إنشاء البرنامج المساعد


 class myplugin : public micro::iplugin { public: myplugin(int ver, const std::string& nm):micro::iplugin(ver, nm) { //     subscribe<2>("sum2", [](std::any a, std::any b)-> std::any { return std::any_cast<int>(a) + std::any_cast<int>(b); }, "  " ); } }; 

تنزيل البرنامج المساعد


 std::shared_ptr<micro::plugins> manager = micro::plugins::get(); std::shared_ptr<micro::iplugin> myplugin = manager->get_plugin("myplugin"); if (myplugin && myplugin->has<2>("sum2")) { std::shared_future<std::any> result = myplugin->run<2>("sum2", 25, 25); result.wait(); std::cout << std::any_cast<int>(result.get()) << std::endl; } 

شاهد المزيد من الأمثلة التفصيلية على صفحة المشروع.


بدلا من الاستنتاج


يسعدني جدا أن أقرأ مقالات إخبارية عن هبرة على C ++ (وليس فقط على C ++) ،
آمل أن تجد هذه المقالة مثيرة للاهتمام ومفيدة إلى حد ما على الأقل.


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


رابط للمشروع


البروتينات الدقيقة

Source: https://habr.com/ru/post/ar422401/


All Articles