जब आप एक std::set बनाते हैं, तो एक टेम्प्लेट पैरामीटर class Compare होता है, जो डिफ़ॉल्ट रूप से std::less<T> होता है।

अब, भले ही आप std::less<T> की विशेषज्ञता न दें, फिर भी T::operator< को परिभाषित करना C++ के लिए "इसका पता लगाने" के लिए पर्याप्त है। लेकिन सी ++ कुछ भी नहीं समझ रहा है, एक कंपाइलर है।

और संकलक एक श्रृंखला के माध्यम से जा रहा है जो मुझे यकीन है कि सरल कदम हैं। वे कदम क्या हैं?

c++
0
Ari Sweedler 27 अगस्त 2020, 02:25

2 जवाब

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

मानक पुस्तकालय को इस तरह परिभाषित किया गया है कि std::less<T> operator< का उपयोग करेगा जब तक कि अन्यथा विशिष्ट न हो। इसलिए यदि आप विशेषज्ञता प्रदान नहीं करते हैं, यदि प्रकार < का समर्थन करता है तो यह काम करेगा।

std::less<T> से :

तुलना करने के लिए फ़ंक्शन ऑब्जेक्ट। जब तक विशिष्ट न हो, operator< को T प्रकार पर आमंत्रित करता है।

और std::less<T>::operator() के लिए:

संभावित कार्यान्वयन:

constexpr bool operator()(const T &lhs, const T &rhs) const
{
    return lhs < rhs;
}
5
François Andrieux 27 अगस्त 2020, 02:49

std::less.

जैसा कि आप देख सकते हैं, यह केवल lhs < rhs का परिणाम देता है।

संकलक std::less<T> के बजाय std::less<void> को कैसे बांधना जानता है, ऐसा इसलिए है क्योंकि std::less<T> की कोई विशेषज्ञता स्पष्ट रूप से नहीं लिखी गई है। इसलिए जब आप इसे मांगते हैं, तो यह स्वतः ही उत्पन्न होना चाहिए।

तो संकलक को std::less<> के बजाय std::less<void> क्यों मिलता है? ऐसा इसलिए है क्योंकि जब आप std::less को कोई टेम्प्लेट पैरामीटर पास नहीं करते हैं तो आपको std::less<void> मिलता है।

0
Ari Sweedler 27 अगस्त 2020, 02:32