في المرة الأخيرة ، استخدمنا SFINAE للكشف عما إذا كان للنوع تعريف ، واستخدمنا ذلك مع
if constexpr
و lambdas العام بحيث يمكن أن يستخدم هذا الرمز النوع إذا تم تعريفه ، بينما لا يزال يتم قبوله من قبل المترجم (ويتم إهماله ) إذا لم يتم تعريف النوع.
ومع ذلك ، كان لدينا استخدام بعض القضايا ، بعض الإزعاج الطفيف ، وبعض أكثر إحباطا.
- كان عليك أن تقول
struct
كل وقت. - إذا لم يكن النوع موجودًا ، فإن تصرف التسمية تسبب في حقن النوع في مساحة الاسم الحالية ، وليس مساحة الاسم التي توقعت أن يكون النوع بها.
- يجب عليك استخدام تقنية
struct
مع اسم غير مؤهل. لا يمكنك استخدامه لاستكشاف نوع لم تستورده في مساحة الاسم الحالية.
يمكننا حل المشكلات الثلاثة مع حل واحد: Predeclare النوع في مساحة الاسم المطلوبة.

بمجرد الانتهاء من ذلك ، لن تحتاج إلى تحديد
struct
لأن الهيكل قد تم الإعلان عنه بالتأكيد. استخدامك لها كمعلمة لنوع القالب في
call_if_defined
لن ينشئ إعلانًا جديدًا ، لأنه تم الإعلان عنه بالفعل. ونظرًا لأنه قد تم إعلانه ، يمكنك الوصول إليه من خلال اسمه غير المؤهل أو اسم مساحة الاسم الكامل أو أي شيء بينهما. أيضا نوع الاسم المستعار أو نوع التابعة. (عذرا ، هؤلاء ليسوا بين.)
namespace app { void foo() { call_if_defined<awesome::special>([&](auto* p) {
بالنسبة لأولئك الذين
call_if_defined
المسلسل من البداية ، ربما لاحظت أن طريقة
call_if_defined
ليست
call_if_defined
تمامًا
call_if_defined
الذي
call_if_defined
سابقًا. الإصدار الجديد يدعم العديد من معلمات النوع ويستدعي lambda فقط إذا تم تعريف جميع الأنواع.
دعنا نلقي نظرة فاحصة:
template<typename... T, typename TLambda> void call_if_defined(TLambda&& lambda) { if constexpr ((... && is_complete_type_v<T>)) { lambda(static_cast<T*>(nullptr)...); } }
الأقواس المزدوجة في if constexpr ((...)) تبدو غريبة ، لكنها مطلوبة. الأقواس الخارجية مطلوبة بواسطة عبارة
if constexpr
، والأقواس الداخلية مطلوبة بواسطة
تعبير fold . التعبير أضعاف يمتد إلى
if constexpr ( (is_complete_type_v<T1> && is_complete_type_v<T2> && ... is_complete_type_v<Tn>))
يستخدم استدعاء lambda
توسيع حزمة المعلمة :
lambda(static_cast<T*>(nullptr)...);
هذا يمتد إلى
lambda(static_cast<T1*>(nullptr), static_cast<T2*>(nullptr), ..., static_cast<Tn*>(nullptr));
حيث يتم تكرار
static_cast<T*>(nullptr)
مرة واحدة لكل نوع.
كما أشرت سابقًا ، يمكننا استخدام هذه الوظيفة للاتصال بـ lambda إذا تم تعريف
جميع الأنواع:
void foo(Source const& source) { call_if_defined<special, magic>( [&](auto* p1, auto* p2) { using special = std::decay_t<decltype(*p1)>; using magic = std::decay_t<decltype(*p2)>; auto s = source.try_get<special>(); if (s) magic::add_magic(s); }); }
C ++ 20 يسمح لك بكتابة هذا كـ
void foo(Source const& source) { call_if_defined<special, magic>( [&]<typename special, typename magic> (special*, magic*) { auto s = source.try_get<special>(); if (s) magic::add_magic(s); }); }
الذي يتيح لك تسمية نوع القالب ، مما يوفر لك مشكلة الاضطرار إلى إعادة
std::decay_t
خلال لعب ألعاب
std::decay_t
.
في المرة القادمة ، سوف نستخدم هذا كنقطة انطلاق ونمد النموذج.
لاحظ لأولئك الذين وصلوا إلى هنا عبر محرك بحث : هذا هو الجزء الأخير من الجزء الأساسي من السلسلة ، ولكن لا تزال هناك أجزاء قادمة. بالنسبة لفارغ الصبر ، إليك الأشياء المراد نسخها:
template<typename, typename = void> constexpr bool is_type_complete_v = false; template<typename T> constexpr bool is_type_complete_v <T, std::void_t<decltype(sizeof(T))>> = true; template<typename... T, typename TLambda> void call_if_defined(TLambda&& lambda) { if constexpr ((... && is_complete_type_v<T>)) { lambda(static_cast<T*>(nullptr)...); } }
بالمناسبة ، لدينا شغور بارد [دبلن]
لقد كان Havok في طليعة الابتكار في تطوير اللعبة و 3D التفاعلية لأكثر من عقد من الزمان. كجزء من Cognition ، الفريق المسؤول عن HoloLens ، نجمع الآن بين هذه الخبرة وقوة Azure Cloud لتطوير العديد من الخدمات الجديدة المثيرة التي تقود تجارب مختلطة من واقع مثل خدمة Azure Remote Rendering. نحن متحمسون للتقارب بين تقنيات AR و VR والسحابية لتمكيننا من إنشاء تجارب واقعية مختلطة.
العمل في هافوك:- ستعمل في فرق صغيرة مركزة مع مطورين موهوبين
- ستتاح لك الفرصة للعمل مع التقنيات الجديدة على مجموعة متنوعة من الأنظمة الأساسية والأجهزة المتطورة
- ستعمل على حل المشكلات الفنية الصعبة ذات النطاق الواسع
- سوف تتعاون مع فرق موهوبة حول العالم
المسؤوليات
- تصميم وتطوير واختبار وتقديم رمز C ++ متعدد الجودة وعالي الجودة ونظيف
- تطوير خدمات Azure قابلة للتطوير بدرجة كبيرة
- العمل مباشرة مع العملاء الداخليين والخارجيين لدفع تطوير المنتج
مؤهلات
- C + الترميز ومهارات التصحيح
- القدرة على العمل في بيئة فريق على قاعدة شفرة مشتركة
- تجربة مع تقنيات الخدمات السحابية والموزعة (مثل Azure Batch و Azure Blob Storage و Docker و Telemetry)
نقاط المكافأة
هناك الكثير من المهارات الأخرى غير المطلوبة ، ولكنها ذات قيمة في جميع أنحاء الفريق وتشمل هذه:
- C # ، ASP.Net ، JavaScript ، TypeScript ، React
- محركات لعبة Unity أو Unreal أو ذات صلة
- تجربة في 3D التفاعلية ، AR أو VR
- خدمات الشبكات والخلفية
- تحسين الأداء
يمكنك الحصول على مزيد من المعلومات وإرسال سيرتك الذاتية
هنا .