मैं क्षमा चाहता हूं, लेकिन शीर्षक के एक वाक्य में मामले को व्यक्त करने में मुझे एक बड़ी समस्या थी।

समस्या: मेरे पास कई "गुणों" के आधार पर एक वर्ग टेम्पलेट है (इस "संपत्ति" कीवर्ड को भी शाब्दिक रूप से न लें):

template<typename ... P>
class C: public P... {}

फिर मुझे अलग, मुफ्त फ़ंक्शन टेम्पलेट चाहिए जो दो उदाहरण लेता है और प्रत्येक "संपत्ति" के लिए कुछ कॉल करता है:

template<typename ... P>
void foo(C<P> &c1, C<P> &c2)
{
    { doSomething<p>()... }      // for each type p in pack P
}

template<typename T>
void doSomething() {}

समस्या यह है कि पी मेरे फ़ंक्शन तर्कों के एक सेट का प्रतिनिधित्व नहीं करता है। इसके बजाय यह तर्क प्रकारों को पैरामीटर करता है। तो मुझे नहीं पता कि "विस्तार" कैसे लिखना है। क्या ऐसा बिल्कुल संभव है?

2
ardabro 17 अप्रैल 2020, 00:29

1 उत्तर

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

मुझे ऐसा लगता है कि आप फ़ंक्शन पैरामीटर में पैरामीटर पैक विस्तार को याद कर रहे हैं। फिर एक छोटा टाइपो भी है (p->P) और आप सभी प्रकार के फ़ंक्शन को निष्पादित करने के लिए एक फोल्ड-एक्सप्रेशन का उपयोग करने का इरादा रखते हैं जिसमें थोड़ा अलग सिंटैक्स होता है:

template<typename ... P>
void foo(C<P...> &c1, C<P...> &c2)
{
    // Parentheses and comma required to signify fold expression using the comma operator
    ( doSomething<P>(), ... ); 
}

मुझे यह भी लगता है कि आप c1 और c2 को doSomething पर पास करना चाहेंगे (जो शायद वह वस्तुओं को T& के रूप में लेना चाहिए, मुझे लगता है?), अन्यथा वह कार्य केवल प्रकार पर निर्भर करेगा, उस प्रकार की वास्तविक वस्तु पर नहीं।

4
walnut 16 अप्रैल 2020, 21:38