سؤال

هل من الممكن أن تتخصص طريقة templatized لتتضمن التعدادات؟

وشيء من هذا القبيل (رمز صالح أدناه):

template <typename T>
void f(T value);

template <>
void f<enum T>(T value);

في حالة انها غير ممكن، ثم لنفترض لدي التخصصات لعدد من أنواع، مثل int، unsigned int، long long، unsigned long long، وما إلى ذلك، ثم أي من التخصصات سوف تستخدم قيمة التعداد؟

هل كانت مفيدة؟

المحلول

ويمكنك استخدام std::enable_if مع <لأ href = "HTTP: / /en.cppreference.com/w/cpp/types/is_enum "يختلط =" نوفولو noreferrer "> std::is_enum من <type_traits> لإنجاز هذا.

في إجابة إلى واحد من أسئلتي ، نشر litb و<م> جدا شرح مفصل ومكتوب بشكل جيد لكيفية هذا يمكن القيام به مع مكافئات دفعة.

نصائح أخرى

ولست متأكدا إذا فهمت سؤالك بشكل صحيح، ولكن يمكنك إنشاء مثيل القالب على تتضمن التعدادات محددة:

template <typename T>
void f(T value);

enum cars { ford, volvo, saab, subaru, toyota };
enum colors { red, black, green, blue };

template <>
void f<cars>(cars) { }

template <>
void f<colors>(colors) { }

int main() {
    f(ford);
    f(red);
}

ويفترض، والشيء الوحيد المثير للاهتمام يمكن أن تفعله مع نوع أنها الشيء الوحيد الذي يعرف عن ذلك هو أنه في التعداد، ويطرح للنوع الكامنة وتعمل على ذلك. وهنا كيف يمكن أن تبدو وكأنها، وذلك باستخدام نهج جيمس اقترح (AKA SFINAE ) :

void Bar(int b); // and/or other underlying types

template<typename T>
typename std::enable_if<std::is_enum<T>::value, void>::type
Foo(T enm)
{
    Bar(static_cast<typename std::underlying_type<T>::type>(enm));
}

وعلى سبيل المكافأة ذات الصلة، وهنا طريقة مماثلة من شأنها فقط الحصول على حل لنوع معين من اختيارك (استبدال منطقي في is_same إلى نوع من اختيارك):

template<typename T>
typename std::enable_if<std::is_same<T,bool>::value, void>::type
Baz(T bl)
{
    if (bl)
    {
        //...
    }
    else
    {
        //...
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top