कल्पना कीजिए हम निम्नलिखित स्थिति है विवश नहीं करता std::copy_if
टेम्पलेट हस्ताक्षर के बाद से संकलक द्वारा विधेय किसी भी प्रकार स्वीकार करता है:क्यों std :: हस्ताक्षर copy_if विधेय प्रकार
template<typename _IIter,
typename _OIter,
typename _Predicate>
_OIter copy_if(// etc...
मैंने पाया है कि अगर मैं एक और अधिक constra में std::copy_if
कॉल लपेट अधिभार संकल्प काम कर इनेड टेम्पलेट फ़ंक्शन:
template<typename _IIter,
typename _OIter,
typename _Predicate = bool(const typename std::iterator_traits<_IIter>::value_type&) >
void copy_if(_IIter source_begin,
_IIter source_end,
_OIter target,
_Predicate pred)
{
std::copy_if(source_begin, source_end, target, pred);
}
मेरा प्रश्न है: क्यों एसटीएल में यह पहले से ही बाध्य नहीं है? मैंने जो देखा है, उससे _Predicate
प्रकार कोई ऐसा फ़ंक्शन नहीं है जो bool
देता है और पुनरावृत्त इनपुट प्रकार स्वीकार करता है, फिर भी यह एक कंपाइलर त्रुटि उत्पन्न करने जा रहा है। तो इस हस्ताक्षर को पहले ही हस्ताक्षर में क्यों न डालें, ताकि ओवरलोड रिज़ॉल्यूशन काम कर सके?
आपकी बाधा बहुत मजबूत है ('const' की आवश्यकता नहीं है, कुछ रूपांतरण की अनुमति है (' int' से 'bool'))। 'decltype' सही आवश्यकता (या अवधारणा) की अनुमति देगा, लेकिन यह विधि C++ 11 से पहले की गई थी। – Jarod42