لماذا يقوم بوظائف التحويل الضمني في التحميل الزائد بالعمل من خلال نوع الإرجاع، في حين أنه غير مسموح به للوظائف العادية؟

StackOverflow https://stackoverflow.com/questions/1128501

سؤال

لا يسمح C ++ في تعدد الأشكال للعبارات على أساس نوع عودتها. ومع ذلك، عند زيادة تحميل وظيفة عضو تحويل ضمنية، يبدو ذلك ممكنا.

هل يعرف أحد لماذا؟ اعتقدت أن المشغلين يتم التعامل معهم مثل الأساليب داخليا.

تحرير: إليك مثال:

struct func {
    operator string() { return "1";}
    operator int() { return 2; }
};

int main( ) {
    int x    = func(); // calls int version
    string y = func(); // calls string version
    double d = func(); // calls int version
    cout << func() << endl; // calls int version
}
هل كانت مفيدة؟

المحلول

لا تعتبر مشغلي التحويلات أكثر حداثة مختلفة ولا يتم استدعاؤها بناء على نوع عودتهم. وبعد سيتم الترجمة استخدامها فقط عند ذلك لابد ان (عندما يكون النوع غير متوافق ويجب تحويله) أو عند طلب صريح استخدام أحدهم مع مشغل يلقي.

دلالة، ما يفعله رمزك هو إعلان عدة مختلف اكتب مشغلي التحويل و لا تزيد من عبء عامل واحد.

نصائح أخرى

هذا ليس نوع الرسل. هذا اكتب التحويل.

النظر في: func () يخلق كائن من النوع func. لا يوجد غموض فيما يتعلق بالطريقة (المنشئ).

السؤال الوحيد الذي لا يزال هو إذا كان من الممكن إلقاء ذلك على الأنواع المرغوبة. لقد قدمت المحول البرمجي مع التحويل المناسب، لذلك هو سعيد.

لا يوجد سبب تقني حقا لمنع التحميل الزائد للوظائف على أنواع النتائج. يتم ذلك في بعض اللغات مثل ADA على سبيل المثال، ولكن في سياق C ++ الذي يحتوي أيضا على تحويلات ضمنية (واثنين منهم)، يتم تقليل الأداة المساعدة، وستؤدي تفاعلات كلا الميزيتين بسرعة إلى الغموض.

لاحظ أنه يمكنك استخدام حقيقة أن التحويلات الضمنية هي تعريف المستخدم محاكاة التحميل الزائد في نوع النتيجة:

class CallFProxy;
CallFProxy f(int);

class CallFProxy {
   int myParameter;
   CallFProxy(int i) : myParameter(i) {}
public:
   operator double() { std::cout << "Calling f(int)->double\n"; return myParameter; }
   operator string() { std::cout << "Calling f(int)->string\n"; return "dummy"; }
};

يتحمل حل الزائد بين وظائف مرشحة متعددة. في هذه العملية، لا يعتبر نوع مرشح المرشحين بالفعل. ومع ذلك، في حالة مشغلي التحويل، فإن "نوع الإرجاع" مهم للغاية في تحديد ما إذا كان هذا المشغل مرشح على الإطلاق.

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