هل يمكن أن يكون لدينا وظيفة مع أنواع الإرجاع متعددة؟(في C++ 11 وما فوق)
function c++11 (2)
هنا حل مثال مع
std:: variant
template < typename T, typename X>
std::variant<T, X> Max_Number ( T valueA, X valueB )
{
std::variant<T, X> res;
if ( valueA > valueB )
res = valueA;
else
res = valueB;
return res;
}
أحاول كتابة وظيفة عامة تأخذ المدخلات كـ
uint8
و
uint32
و
uint64
و
uint64
و .... وإرجاع القيمة القصوى مع نوع البيانات الخاص بالعنصر الأكبر؟
فمثلا:
template < typename T, typename X>
auto Max_Number(T valueA, X valueB)
{
if (valueA > valueB)
return valueA;
else
return valueB;
}
ملاحظة: يفترض هذا المثال أن أكبر عنصر هو من نوع البيانات الأكبر.
يجب تحديد نوع الإرجاع في وقت الترجمة.
يمكنك استخدام
std::common_type
(منذ
std::common_type
C ++ 11):
بالنسبة للأنواع الحسابية غير الخاضعة للترقية ، قد يتم عرض النوع الشائع كنوع من التعبير الحسابي (ربما مختلط النمط) مثل
T0() + T1() + ... + Tn()
.
template < typename T, typename X>
typename std::common_type<T, X>::type Max_Number ( T valueA, X valueB ) {
...
}
أو استخدم
std::conditional
(منذ C ++ 11) للإعلان عن نوع الإرجاع كنوع كبير (
sizeof
أكبر).
template < typename T, typename X>
typename std::conditional<sizeof(T) >= sizeof(X), T, X>::type Max_Number ( T valueA, X valueB ) {
...
}
لاحظ أنه في هذه الحالة ، إذا كان
T
و
X
لهما نفس الحجم ، فسيتم دائمًا استخدام
T
كنوع الإرجاع.
إذا كنت ترغب في التحكم فيه بشكل أكثر دقة ، يمكنك استخدام بعض السمات لتحديد النوع الدقيق.