تخزين نوع النوع لمعالجة قوائم وسيطة متغير
-
22-09-2019 - |
سؤال
هل من الممكن فعل شيء على غرار:
type t = int;//this would be a function which identifies what type the next argument is
if( t == int )
printf( "%d", va_arg( theva_list, t ) );
بطريقة تافهة نسبيا؟ الكائن الوحيد الذي أعرفه والذي يمكن أن يحمل نوعًا هو type_info ولا يمكنني معرفة كيفية استخدامه بهذه الطريقة.
شكرا ، باتريك
المحلول
بشكل عام ، لا. لا يمكن تخزين الأنواع إلا إلا مع التلاعب بها ، وما إلى ذلك ، في وقت الترجمة. إذا كنت تريد شيئًا ما في وقت التشغيل ، فيجب عليك تحويل (عادةً عبر metaprogramming المشعر) النوع إلى قيمة من نوع ما (على سبيل المثال ، التعداد).
ربما سيكون من الأفضل إذا أعطيت وصفًا أعلى إلى حد ما لما تحاول حقًا إنجازه هنا - يبدو مزيج من قوائم الوسيطة المتغيرة مع محاولة "التبديل على النوع" وكأنه حادث قطار على وشك الحدوث .. .
نصائح أخرى
ليس بالطريقة التي قد تفكر بها. يتم تقييم أنواع مثل "int" في نوع الترجمة. تريد تقييم نوع في وقت التشغيل.
ربما ترغب في جعل مرجع "T" وظيفة ، أو مثيل للفئة التي لها وظيفة افتراضية ، واحدة لكل نوع. في الأساس ، تريد نمط الأوامر ، حيث يكون الأمر "تنسيق قيمة" والمثيلات المختلفة للأمر تتوافق مع الأنواع المختلفة التي يمكن تنسيقها.
استخدم التخصص:
void smart_print(int t)
{
printf("%d", i);
}
void smart_print(double f)
{
printf("%g", f);
}
ولكن بمساعدة القوالب ، يمكنك أيضًا حل المؤشر إلى الوظيفة المتوقعة ، لذلك تعامل مع المؤشر كمعرف من النوع وستحصل على النتيجة المرجوة
يجب أن تنظر إلى كيفية <<
و >>
يعمل المشغلون في فصول الدفق (Cout و CIN على سبيل المثال). ربما سيعطيك ذلك فكرة عن كيفية حل مشاكلك - أي الوظائف المحملة.