मेरे पास एक एनम क्लास है और मेरे पास बहुत समान कोड का यह गुच्छा है जो एनम को टेम्प्लेटेड फ़ंक्शन कॉल में परिवर्तित करता है:
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
मैक्रोज़ के साथ जेनरेट कर सकता हूं। क्या मैं टेम्प्लेट के साथ कुछ भी कर सकता हूं? मैं प्रत्येक एनम प्रकार के लिए एक टेम्प्लेट क्लास बना सकता हूं, प्रत्येक वर्ग में सभी फ़ंक्शन शामिल हैं। लेकिन उस फ़ंक्शन को नाम से कैसे कॉल करें?
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);
आप 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
पर की जाने वाली सभी कॉलों का वैध होना आवश्यक है। केवल वही नहीं जिसे स्विच द्वारा चुना जाता है।
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।