मेरे पास एक एनम क्लास है और मेरे पास बहुत समान कोड का यह गुच्छा है जो एनम को टेम्प्लेटेड फ़ंक्शन कॉल में परिवर्तित करता है:

auto func1(Type type, ...params)
{
    switch (type)
    {
    case Type::typeA: return func1<Type::typeA>(params);
    case Type::typeB: return func1<Type::typeB>(params);
    case Type::typeC: return func1<Type::typeC>(params);
    ...
    }
}

auto func2(Type type, ...params)
{
    switch (type)
    {
    case Type::typeA: return func2<Type::typeA>(params);
    case Type::typeB: return func2<Type::typeB>(params);
    case Type::typeC: return func2<Type::typeC>(params);
    ...
    }
}

// more such func3, func4, ...

मैं इस कोड को #define मैक्रोज़ के साथ जेनरेट कर सकता हूं। क्या मैं टेम्प्लेट के साथ कुछ भी कर सकता हूं? मैं प्रत्येक एनम प्रकार के लिए एक टेम्प्लेट क्लास बना सकता हूं, प्रत्येक वर्ग में सभी फ़ंक्शन शामिल हैं। लेकिन उस फ़ंक्शन को नाम से कैसे कॉल करें?

0
wibotwi 30 मार्च 2020, 08:02

2 जवाब

सबसे बढ़िया उत्तर

आप कुछ ऐसा कर सकते हैं:

template <typename Func, typename... Params>
auto visit(Func func, Type type, Params&&... params)
{
    switch (type)
    {
    case Type::typeA:
        return func(std::integral_constant<Type, Type::typeA>{}, std::forward<Params>(params)...);
    case Type::typeB:
        return func(std::integral_constant<Type, Type::typeB>{}, std::forward<Params>(params)...);
    case Type::typeC:
        return func(std::integral_constant<Type, Type::typeC>{}, std::forward<Params>(params)...);
    //...
    }
}

कॉल के समान:

visit([](auto t, int e){ return Func1<t()>(e); }, type, 42);

डेमो

1
Jarod42 30 मार्च 2020, 10:37

आप func1/2/3 को टेम्प्लेट टेम्प्लेट पैरामीटर के रूप में पास कर सकते हैं और कॉल को उस पर अग्रेषित कर सकते हैं।

typename <template <typename> typename Func, typename... Params>
auto switchFunction(Type type, Params&&... params) {
    switch (type)
    {
    case Type::typeA: return Func<Type::typeA>(std::forward<Params>(params)...);
    case Type::typeB: return Func<Type::typeB>(std::forward<Params>(params)...);
    case Type::typeC: return Func<Type::typeC>(std::forward<Params>(params)...);
    ...
    }
}

फिर आप उस तरह का उपयोग करें

auto someOtherFunc(Type type, int param1, double param2)
{
    return switchFunction<func1>(type, param1, param2);
}

इसके लिए काम करने के लिए, func1 के सभी संस्करणों को एक ही प्रकार वापस करना होगा।

इसके अतिरिक्त func1 पर की जाने वाली सभी कॉलों का वैध होना आवश्यक है। केवल वही नहीं जिसे स्विच द्वारा चुना जाता है।

0
super 30 मार्च 2020, 09:38
ओपी को टेम्प्लेट क्लासेस में टेम्प्लेट फ़ंक्शंस को भी बदलना है।
 – 
Jarod42
30 मार्च 2020, 10:19