سؤال

أي فرصة للاستخدام enable_if مع مشغل تحويل النوع؟ يبدو صعبًا ، نظرًا لأن كلا من نوع الإرجاع وقائمة المعلمات ضمنية.

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

المحلول

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

نصائح أخرى

من البحث الصغير الذي قمت به (وتجاهل تعليق C ++ 0x من جوهانس) ، فإن إجابتي هي أنه يعتمد على ما تريده enable_if إلى عن على. إذا كنت تريد عملية التحويل إلى T لوجود أم لا من النوع T ثم يبدو أن الإجابة هي لا ، لا توجد طريقة في C ++ 03 (كما قال Ugo). ولكن إذا كنت بحاجة إلى enable_if لتغيير ال سلوك من المشغل اعتمادا على نوع T ثم نعم ، هناك حل بديل هو استدعاء وظيفة المساعد الممكّن (تسمى to<T> كما اقترح ماتيو).

#include<iostream>
#include<boost/utility/enable_if.hpp>
#include<boost/type_traits/is_class.hpp>

struct B{
    B(const B& other){}
    B(){}
};

struct A{
    template<class T>
    T to(typename boost::enable_if_c<not boost::is_class<T>::value, void*>::type = 0){
        std::clog << "converted to non class" << std::endl;
        return T(0);
    }
    template<class T>
    T to(typename boost::enable_if_c<boost::is_class<T>::value, void*>::type = 0){
        std::clog << "conveted to class" << std::endl;
        return T();
    }
    template<class T>
    operator T(){
        return to<T>();
    }
};

int main(){
    A a;
    double d = (double)a; // output: "converted to non class"
    B b = (B)(a); // output: "converted to class"
    return 0;
}

للسجل ، شعرت بالإحباط من هذا لعدة أيام ، حتى أدركت أنني أردت enable_if ليس ل sfinae ولكن لتغيير السلوك وقت الترجمة. قد تجد أيضًا أن هذا هو السبب الحقيقي لحاجتك enable_if ايضا. مجرد اقتراح.

(يرجى ملاحظة أن هذه إجابة لعصر C ++ 98)

على الرغم من أنني أستطيع أن أفهم الاهتمام النظري بالسؤال ، إلا أنني أشعر شخصيًا بالامتناع عن استخدام مشغلي التحويل قدر الإمكان.

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

إذا كنت أرغب في تسهيل التحويلات ، فأنا أفضل شيئًا على طول خط:

template <class T>
T to() const;

الذي لا يعاني من القيود (من حيث توقيع) مشغل التحويل ويتطلب احتجاجًا صريحًا ، لمجرد أنه أكثر وضوحًا.

في الواقع ، لقد وجدت طريقة ؛ نستخدم فئة خاصة وغير مستخدمة لتحديد التحويل الذي لا ينبغي أن يكون موجودًا ، ونستخدمه boost::mpl::if_ لتحديد ما إذا كان سيتم إنتاج تحويل إلى التحول ، أو إلى النوع المطلوب.

class A {
    class NoConversion { };
    template<class B> operator typename boost::mpl::if_<Cond, B, NoConversion>::type() const;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top