سؤال

نظرا لاثنين متطابقة boost::variant الحالات a و b, ، التعبير ( a == b ) مسموح.

لكن ( a != b ) يبدو أنه غير محدد.لماذا هذا؟

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

المحلول

أعتقد أنه لم تتم إضافته إلى المكتبة.لن يساعد Boost.Operators حقًا، لأن أيًا من المتغيرين قد يكون مشتقًا من Boost::operator::equality_comparable.ديفيد بيير محق في قوله أنه يمكنك استخدام ذلك، ولكن إجابتك صحيحة أيضًا، حيث لن يتم العثور على عامل التشغيل الجديد!= بواسطة ADL، لذا ستحتاج إلى عامل تشغيل يستخدم.

أود أن أطرح هذا السؤال على القائمة البريدية للمستخدمين المعززين.

تحرير من تعليق @AFoglia:

وبعد سبعة أشهر، وأنا أدرس Boost.Variant، وتعثرت في هذا التفسير الأفضل لقوائم الإغفال.

http://boost.org/Archives/boost/2006/06/105895.php

operator== المكالمات operator== للفئة الفعلية الموجودة حاليًا في المتغير.وكذلك الدعوة operator!= ينبغي أيضا الاتصال operator!= الطبقة.(لأنه، من الناحية النظرية، يمكن تعريف الفصل على هذا النحو a!=b ليست هي نفسها !(a==b).) وهذا من شأنه أن يضيف متطلبًا آخر وهو أن تحتوي الفئات الموجودة في المتغير على operator!=.(هناك جدل حول ما إذا كان بإمكانك القيام بهذا الافتراض في سلسلة رسائل القائمة البريدية.)

نصائح أخرى

هذا هو رابط للإجابة من المؤلف نفسه عندما تمت صياغة هذا السؤال في القائمة البريدية المعززة

تلخيص ذلك، في رأي المؤلف، سيؤدي تنفيذ عوامل المقارنة (!= و<) إلى إضافة المزيد من المتطلبات على الأنواع المستخدمة لإنشاء النوع المتغير.

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

لأنه لا يحتاج إلى ذلك.

دفعة لديه مكتبة المشغلين الذي يحدد المشغل!= في مصطلح المشغل==

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