سؤال

هل من الممكن كتابة قالب نجاة في C ++؟ وهذا هو، وهو القالب الذي سيعطي في بعض الأحيان نوعا مختلفا آخر ناتجا أو int لنفس معلمات القالب. على سبيل المثال، هل من الممكن كتابة قالب Foo<T> أين Foo<int>::type في بعض الأحيان char وفي أوقات أخرى floatب أو قالب Foo<T> أين Foo<double>::my_static_const_int في بعض الأحيان 10 مرات أخرى 20؟

هل كانت مفيدة؟

المحلول

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

تذكر ذلك Foo<T> المراجع فئة إذا Foo هو قالب فئة. إذا تم تعريف عضو Typedef في الفصل ليكون نوعا واحدا في نقطة واحدة في البرنامج، ونوع آخر في نقطة أخرى، فيجب أن يكون هناك خطأ ما. فيما يلي عروض أسعار قياسية مختلفة التي تهم هذا


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


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


(تخطي "الضوضاء" المختلفة)

.. كيانات قد يتم تعريفها متعددة في البرنامج بأكمله ..]. بالنظر إلى مثل هذا الكيان الذي يدعى D محددة في أكثر من وحدة ترجمة واحدة، إذن

  • يتكون كل تعريف من D من نفس تسلسل الرموز؛
  • في كل تعريف للأسماء المقابلة، يجب أن يشير الأسماء المقابلة، وفقا ل 3.4، إلى كيان محدد ضمن تعريف D، أو يجب أن يشير إلى نفس الكيان، بعد حل الزائد (13.3) وبعد مطابقة تخصص القوالب الجزئي (14.8) .3) ...
  • إذا كان D قالب، ويتم تعريفه في أكثر من وحدة ترجمة واحدة، فإن المتطلبات الأربعة الأخيرة من القائمة أعلاه تطبق على الأسماء من النطاق المرفق للقالب المستخدم في تعريف القالب (14.6.3)، وكذلك الأسماء المعالين عند نقطة مثيل (14.6.2). إذا كانت تعريفات D التي ترضي جميع هذه المتطلبات، فإن البرنامج يتصرف كما لو كان هناك تعريف واحد لل D. إذا كانت تعريفات D لا تفي بهذه المتطلبات، فإن السلوك غير محدد.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top