2016-09-27 7 views
8

non-type template arguments with auto के आगामी सी ++ 17 सुविधा के साथ, यह इस तरह से std::function लागू करने के लिए संभव हो जाएगा के रूप में, डाल करने के लिए सक्षम होने के लिए उदाहरण के लिए, निम्न कार्य:ऑटो फीचर के साथ सी ++ 17 टेम्पलेट तर्कों को std :: function ऑब्जेक्ट्स को बाधित करने की अनुमति होगी?

bool f(int n, double d) {}  
    bool g(bool b, char c) {} 
    bool h(bool b)   {} 
में

ऑटो टेम्प्लेट की std::function ऑब्जेक्ट्स:

std::function<bool(auto, auto)> faa = f; // ok 
    std::function<bool(int, auto)> fia = f; // ok 
    std::function<bool(double, auto)> fda = f; // error: function type mismatch 
    std::function<bool(auto, auto)> gaa = g; // ok 
    std::function<bool(auto, auto)> haa = h; // error: function type mismatch 
    std::function<bool(auto)>   ha = h; // ok 

और इसी तरह।

दूसरे शब्दों में, std::function ऑब्जेक्ट्स स्वीकार करने वाले फ़ंक्शन प्रकारों पर बाध्य हैं?

(वर्तमान में, जीसीसी पर हम एक error: 'auto' parameter not permitted in this context मिलता है।)

+0

आप 'std :: function 'को कैसे कॉल करेंगे, मान लीजिए कि ऐसी कोई चीज़ मौजूद है? –

+0

@ एनएम .: बहुत, बहुत सावधानी से। –

+0

@ लाइटनेसरेसेसिन ऑर्बिट प्री-सी ++ 17 कार्यों की सामान्य मैला कॉलिंग के विपरीत? –

उत्तर

7

उन गैर प्रकार टेम्पलेट तर्क नहीं हैं, इसलिए auto नहीं सी ++ 17 में वहाँ की अनुमति दी है।

गैर-प्रकार के टेम्पलेट तर्क टेम्पलेट्स के लिए तर्क हैं जो पॉइंटर्स या पूर्णांक या समान, वास्तविक मान, प्रकार नहीं हैं।

एक उदाहरण के लिए,

std::integral_constant<std::size_t, 7>; 

यहाँ 7 प्रकार std::size_t और मूल्य 7 की एक गैर प्रकार टेम्पलेट तर्क है।

गैर प्रकार टेम्पलेट auto परमिट कुछ की तरह:

template<auto x> 
using integral = std::integral_constant< decltype(x), x >; 

अब integral<7>std::integral_constant<int, 7> है।

दूसरी ओर, auto का उपयोग प्रकार, गैर-प्रकार के स्थान पर नहीं है।


वहाँ एक सुविधा जहां टेम्पलेट के प्रकार निष्कर्ष निकाला जाता है, तो आप लिख सकते हैं:

std::function faa = f; 

अगर वे std::function संवर्धित एक समारोह सूचक से एक हस्ताक्षर अनुमान करने में सक्षम होना (या गैर -टेम्प्लेट कॉल करने योग्य)।

नोट हालांकि यह std::function एक निश्चित हस्ताक्षर होगा, टेम्पलेट नहीं। सुविधा बस कटौती, टेम्पलेट गतिशील प्रेषण की अनुमति देता है।

मुझे नहीं पता कि std::function सी ++ 17 में इस तरह से बढ़ाया गया था, लेकिन ऐसा करने के लिए भाषा सुविधा को जोड़ा गया था।

+0

* "टेम्पलेट गतिशील प्रेषण" * हे भगवान ...मुझे उम्मीद है कि यह बात कभी भी मौजूद नहीं है –

+0

@ गुइलाउमरासिकोट बस एक कंपाइलर, स्रोत का एक अमूर्त जहाज भेजता है, और कॉलर को टेम्पलेट तर्कों के लिए समान प्रदान करने की आवश्यकता होती है। इसे संकलित करें और प्रेषण के दौरान संकलन को याद रखें। बहुत आसान! स्क्रिप्टिंग/बाइटकोड भाषाएं हर समय ऐसा करती हैं (आमतौर पर सी ++ टेम्पलेट्स की तुलना में कम शक्ति के साथ)। – Yakk

संबंधित मुद्दे