هل يمكن أن يكون لدينا وظيفة مع أنواع الإرجاع متعددة؟(في 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 كنوع الإرجاع. إذا كنت ترغب في التحكم فيه بشكل أكثر دقة ، يمكنك استخدام بعض السمات لتحديد النوع الدقيق.







return-type