से टेम्पलेट तर्क कटौती मैं वर्तमान में इस बारे में सोच रहा हूं कि std::sting
के साथ-साथ स्ट्रिंग अक्षर के लिए सामान्य प्रकार के टेम्पलेट को कैसे बाध्य किया जाए। इसलिए मैं std::is_same
का उपयोग करके वांछित प्रकार के साथ अनुमानित प्रकार की तुलना करता हूं। std::string
के मामले में यह तुरंत काम करता है। स्ट्रिंग अक्षर के लिए, एक char const array का अर्थ है, यह केवल तभी काम करता है जब मैं std::decay
प्रकार पर उपयोग करता हूं और फिर परिणाम char const *
पर परिणाम की तुलना करता हूं। यदि मैं सीधे टाइप किए गए प्रकार की तुलना करता हूं जो मुझे लगता है कि यह होना चाहिए, is_same
झूठा रिटर्न देता है, जैसा कि निम्न उदाहरण कोड द्वारा दिखाया गया है।स्ट्रिंग लिटल
char const [5] : char const [5]
0
char const * __ptr64 : char const * __ptr64
1
अब, क्यों is_same
रिटर्न पहले मामले में झूठी भले ही प्रकार के समान दिखाई देते हैं कि मैं क्या सोच रहा हूं:
template <class TYPE>
void function(TYPE&& parameter)
{
//this doesn't work as expected
std::cout << typeid(TYPE).name() << " : " << typeid(char const [5]).name() << std::endl;
std::cout << std::is_same<char const [5], TYPE>::value << std::endl;
//this works as expected
std::cout << typeid(std::decay_t<TYPE>).name() << " : " << typeid(char const *).name() << std::endl;
std::cout << std::is_same<char const *, std::decay_t<TYPE>>::value << std::endl;
}
int main(int argc, char** argv)
{
function("name");
return 0;
}
उत्पादन उत्पन्न निम्नलिखित है।
केवल संभावित व्याख्या यह है कि मैं के साथ आ सकता है कि समारोह std::is_same
भीतर std::decay
के लिए इसी तरह एक परिवर्तन प्रकार (उदाहरण के लिए एक समारोह कॉल) को लागू किया जाता है। लेकिन फिर फिर से यह परिवर्तन अन्य प्रकार के साथ भी होगा, जो एक ही परिणाम प्रदान करेगा और इसके परिणामस्वरूप समानता होगी।
सी ++ 17 तक प्रतीक्षा करें, और 'std :: string_view' का उपयोग करने के लिए अपना टेम्पलेट लिखें। –
'TYPE' से संदर्भों को हटाने का प्रयास करें। स्ट्रिंग अक्षर हैं lvalues। –
धन्यवाद, आप सही थे। मुझे यह नहीं पता था। लाइन को 'std :: is_same> :: वैल्यू के परिणाम समानता में बदल रहा है। स्ट्रिंग अक्षर को लालसा क्यों माना जाता है? अगर यह एक शाब्दिक था तो इसे एक रावल माना जाएगा, है ना? और क्या हम इसे स्वीकार कर सकते हैं? –
user1488118