سؤال

لماذا لا نرى ج-مثل اللغات التي تسمح callables مع تعدد الأشكال في عودة النوع ؟ أستطيع أن أرى كيف يمكن الإضافية نوع الاستدلال من شأنه أن يكون عقبة, ولكن لدينا الكثير من اللغات مع كامل نوع الاستدلال الأنظمة (التي تعمل على مستويات مختلفة من "العمل").

تحرير: قبل العودة من نوع تعدد الأشكال أعني إثقال وظيفة التوقيع فقط في نوع الإرجاع.على سبيل المثال, C++ و جافا تسمح فقط الحمولة الزائدة في نوع من المعلمات رسمية ، وليس في نوع الإرجاع.

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

المحلول

إذا كان عن طريق "العائد من نوع تعدد الأشكال" يعني إثقال على أساس عودة نوع القيمة ، أنا غير متأكد حول لغات أخرى ، ولكن ل C++ هنا الجواب (تقريبا من فم الحصان):

وظيفة عودة أنواع لا تأتي في اللعب في الزائد القرار ببساطة لأن Stroustrup (أفترض مع مدخلات من الآخرين C++ المهندسين المعماريين) أراد الزائد القرار 'السياق المستقلة'.انظر 7.4.1 - "الحمولة الزائدة والعودة نوع" من "لغة البرمجة C++ ، الطبعة الثالثة".

السبب هو الحفاظ على القرار فرد المشغل أو وظيفة دعوة سياق مستقل.

أرادوا أن تستند فقط على كيفية الزائد كان يسمى - كيف كانت النتيجة المستخدمة (إذا كانت تستخدم على الإطلاق).في الواقع, العديد من الوظائف وتسمى دون نتيجة أو نتيجة أن تستخدم كجزء من مجموعة أكبر من التعبير.أحد العوامل التي أنا متأكد عندما قرروا هذا إذا كان العائد نوع كان جزءا من القرار سيكون هناك العديد من المكالمات إلى طاقتها المهام التي سوف تحتاج إلى حل مع القواعد المعقدة أو يجب أن يكون المترجم رمي خطأ أن الدعوة كانت غامضة.

و الله يعلم, C++ الزائد القرار معقدة بما فيه الكفاية كما هو عليه...

نصائح أخرى

أنا أحب أن أرى هذه الميزة في بعض اللغة ، وليس ذلك إلا أن وظيفة فو العودة مزدوجة أو الباحث أو سلسلة ، ولكن أيضا بحيث فو عودة هيكل أو كائنات من مختلف الطبقات.Disambiguating المكالمات ستكون تافهة إلى حد ما - إذا كانت الدعوة غامضة ، تتطلب الزهر لتحديد نوع الإرجاع المطلوب.على سبيل المثال:

string s = foo();    //foo returns a string
double x = foo();    //foo returns a double
int i = foo();       //foo returns an integer
float f = (float)(int)foo();    //call the int foo and convert to float

بالإضافة

Animal a = fooFactory();    //fooFactory returns an Animal
Plant p = fooFactory();     //foofactory returns a Plant

هذه الحالات لا تأتي في كثير من الأحيان, ولكن عندما تفعل ذلك الحل هو في كثير من الأحيان إلى حد ما قبيح...

double x = (double)foo();

أعلاه هو غامض إذا كان هناك إصدارات فو() يمكن العودة مزدوج, int, float, الخ.

في C++ يمكنك أن تفعل هذا مع الطبقات إلى حد كبير.على سبيل المثال ، يجب أن يكون نوع البيانات التي يتم تحويلها بشكل روتيني إلى ASCII على الإدخال و الإخراج ؛

typedef char* pchar;

class   MyType
{
public:

 operator pchar() { return(ConvertToASCII()); }
 MyType& operator=(char* input) { ConvertFromASCII(input); return(*this); }

 pchar ConvertToASCII();
 void ConvertFromASCII(pchar ASCII);
}

هذا النوع من الشيء هو غالبا ما تستخدم في C++ الأطر.على سبيل المثال, إلقاء نظرة على implmentation من MFC CString الدرجة.IMHO ، بل هو أداة مفيدة جدا ، وإن كانت خطرة في ظروف معينة.

لأن السيارات-تحويل الأنواع ، فإنه ليس من الواضح معرفة وظيفة الاتصال عند العودة أنواع هي قريبة.

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