إيقاف وظيفة التحويل الضمني
-
25-09-2019 - |
سؤال
صادفت وضعًا غريبًا اليوم حيث كنت بحاجة إلى وظيفة لعدم تحويل القيم ضمنيًا.
بعد النظر في Google وجدت هذا http://www.devx.com/cplus/10minutesolution/37078/1954
لكنني اعتقدت أنه كان من الغباء بعض الشيء استخدام حمولة زائدة عن الوظيفة لكل نوع آخر أريد حظره ، وبدلاً من ذلك فعلت ذلك.
void function(int& ints_only_please){}
int main () {char a = 0 ؛ int b = 0 ؛ وظيفة (أ) ؛ وظيفة (ب) ؛ }
عرضت الكود لصديق واقترح أن أضفت Const قبل int ، لذا فإن المتغير غير قابل للتحرير ، ولكن عندما بدأت في التجميع بشكل جيد ولكن لا ينبغي أن ننظر أدناه لمعرفة ما أعنيه
void function(const int& ints_only_please){}
int main () {char a = 0 ؛ int b = 0 ؛ وظيفة (أ) ؛ // يجب أن يتوقف برنامج التحويل البرمجي هنا ولكنه لا يعمل مع وظيفة const int (ب) ؛ }
لا أحد يعرف لماذا يحدث هذا؟
المحلول
استخدم القوالب للحصول على التأثير المطلوب:
template <class T>
void foo(const T& t);
template <>
void foo<int>(const int& t)
{
}
int main(){
foo(9); // will compile
foo(9.0); // will not compile
return 0;
}
لاحظ أننا نكتب فقط نسخة خاصة من القالب int
بحيث تؤدي المكالمة التي لها أي نوع آخر كمعلمة قالب إلى خطأ في التجميع.
نصائح أخرى
من القانوني ربط مؤقت بـ const
المرجع ، ولكن ليس غيرconst
المرجعي.
أ char
يمكن تحويلها ضمنيًا إلى int
والمؤقتة التي هي نتيجة هذا التحويل يمكن أن تكون مرتبطة بـ const int&
معلمة الوظيفة تمدد عمر المؤقتة حتى تخرج الوظيفة.