سؤال

صادفت وضعًا غريبًا اليوم حيث كنت بحاجة إلى وظيفة لعدم تحويل القيم ضمنيًا.

بعد النظر في 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& معلمة الوظيفة تمدد عمر المؤقتة حتى تخرج الوظيفة.

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