Friday 15 May 2015

c++ - How to pass a template function in a template argument list -


मान लें कि मेरे पास टेम्पलेट फ़ंक्शन है:

  template & lt; टिनामनाम टी एंड जीटी; टी उप-उत्पाद_कार्य () {वापसी टी (5); }   

मैं इस पूरे टेम्पलेट को किसी अन्य टेम्पलेट से कैसे पारित कर सकता / सकती हूं?

यदि produce_5_function < / कोड> एक मज़ेदार था, कोई समस्या नहीं होगी:

  टेम्पलेट & lt; typename T & gt; स्ट्रक्चर प्रोडक्शन__फंक्टर {टी ऑपरेटर () () कॉन्स्ट {रिटर्न टी (5); }}; टेम्पलेट & lt; टेम्पलेट & lt; typename T & gt; कक्षा F & gt; Struct client_template {int ऑपरेटर () () const {return F & lt; int & gt; () (); }}; Int five = client_template & lt; उप-उत्पादक & gt; () ();   

लेकिन मैं एक कच्चे फ़ंक्शन टेम्पलेट के साथ ऐसा करने में सक्षम होना चाहता हूं:

  टेम्पलेट & lt; ??? एफ & gt; Struct client_template {int ऑपरेटर () () const {return F & lt; int & gt; (); }}; Int five = client_template & lt; Produce_5_function & gt; () ();   

मुझे संदेह है कि "आप ऐसा नहीं कर सकते"।

< Blockquote>

मुझे संदेह है कि "आप ऐसा नहीं कर सकते"।

हां, यह मामला है, आप फ़ंक्शन टेम्पलेट को टेम्पलेट तर्क के रूप में नहीं दे सकते। 14.3.3 से:

टेम्पलेट-टेम्प्लेट-पैरामीटर के लिए एक टेम्पलेट-तर्क क्लास टेम्पलेट का नाम या उपनाम टेम्पलेट, आईडी-अभिव्यक्ति के रूप में व्यक्त किया जाएगा।

टेम्पलेट फ़ंक्शन को तत्काल से पहले करने की आवश्यकता है, आप इसे अन्य टेम्पलेट पर पास करते हैं। एक संभावित समाधान एक क्लास प्रकार को पास करना होता है जो एक स्थिर उपनिर्मित कार्यप्रणाली जैसा दिखता है:

  टेम्पलेट & lt; typename T & gt; स्ट्रक्चर वर्राअराउंड {स्थिर टी उपपादन_अभियान () {रिटर्न टी (5); }}; टेम्पलेट & lt; टेम्पलेट & lt; typename & gt; कक्षा F & gt; Struct client_template {int ऑपरेटर () () const {return F & lt; int & gt; :: produce_5_functor (); }}; Int five = client_template & lt; वर्राअराउंड & gt; () ();   

उपनाम टेम्पलेट्स का उपयोग करके, मैं थोड़ा करीब आ सकता है:

  टेम्पलेट & lt; typename T & gt; टी उप-उत्पादक_कार्यकर्ता () {वापसी टी (5); } टेम्पलेट & lt; typename R & gt; Prod_func = R () का उपयोग कर; टेम्पलेट & lt; टेम्पलेट & lt; typename & gt; कक्षा F & gt; Struct client_template {int ऑपरेटर () (एफ & lt; int & gt; f) const {return f (); }}; Int five = client_template & lt; prod_func & gt; () (produce_5_functor);    

No comments:

Post a Comment