C ++ वेरिएडिक टेम्पलेट टाइपिस्ट पर दोहराव [डुप्लिकेट]

Dec 09 2020

मान लीजिए कि मैं टाइपिस्ट के रूप में एक वैरेडिक टेम्पलेट का उपयोग करता हूं:

template <typename ... Types> struct tl {};
using my_list = tl<MyTypeA, MyTypeB, MyTypeC>;

अब मैं प्रत्येक प्रकार के लिए एक टेम्प्लेट फ़ंक्शन को आमंत्रित करना चाहता हूं, जैसे:

myFunc<MyTypeA>();
myFunc<MyTypeB>();

मैं इसे कैसे पूरा करूंगा?

जवाब

1 super Dec 09 2020 at 18:38

C ++ 17 के साथ आप फोल्ड एक्सप्रेशन का उपयोग कर सकते हैं ।

template <typename ... Types>
void callMyFunc(my_list<Types...>) {
    (myFunc<Types>(), ...);
}
1 Jarod42 Dec 09 2020 at 18:37

C ++ 17 के साथ, आप गुना अभिव्यक्ति का उपयोग कर सकते हैं

template <typename ...Ts>
void call_my_func(my_list<Ts...> )
{
    (myFunc<Ts>(), ...);
}
1 MarekR Dec 09 2020 at 18:47

C ++ 11 संस्करण:

template <typename ... Types>
void forEachMyFunc(tl<Types...>)
{
    int dummy[] = {
        (myFunc<Types>(), 0)...
    };
    (void)dummy;
}

https://godbolt.org/z/4nK67M

यहाँ अधिक कुटिल संस्करण है :

template<typename T>
class MyFunc {
public:
    void operator()() const {
        myFunc<T>();
    }
};

template <template<typename> class F, typename ... Types>
void forEachTypeDo(tl<Types...>)
{
    int dummy[] {
        (F<Types>{}(), 0)...
    };
    (void)dummy;
}
...
forEachTypeDo<MyFunc>(my_list{});