2012-12-12 10 views
5

यह कोड गलत आउटपुट क्यों उत्पन्न करता है?टेम्प्लेट फ़ंक्शन is_same टेम्पलेट कक्षाओं में

//this-type.cpp 

#include <iostream> 
#include <type_traits> 

using namespace std; 

template<typename testype> 
class A 
{ 
public: 
    A() 
    { 
     cout << boolalpha; 
     cout << is_same<decltype(*this), A<int>>::value << endl; 
    } 
}; 

class B : public A<int> 
{ 
}; 

int main() 
{ 
    B b; 
} 

आउटपुट:

$ g++ -std=c++11 this-type.cpp 
$ ./a.out 
false 

के प्रकार के "* इस" अंदर बी के माध्यम से एक एक < पूर्णांक> है, है ना?

उत्तर

8

*thisA प्रकार का एक प्रकार का है, इसलिए decltype(*this) संदर्भ प्रकार A & देगा। याद decltype एक lvalue पर संदर्भ प्रकार देता है:

cout << is_same<decltype(*this), A<int>>::value << endl; 
    cout << is_same<decltype(*this), A<int> &>::value << endl; 

आउटपुट:

false 
true 
+0

, 'यह' की पूरी प्रकार क्या है, ' और * यह'? –

+0

हालांकि निश्चित रूप से स्पष्ट नहीं है। –

+0

अंतिम पंक्ति मेरे लिए काम नहीं करती है। मेरा आउटपुट 'झूठा', 'सत्य', 'झूठा' (जी ++ (उबंटू/लिनारो 4.7.2-2ubuntu1) 4.7.2) –

0

क्या आप वाकई decltype(*this) हैं एक है? आपको उस पर एक बदसूरत cout डीबग लाइन के साथ जांच करनी चाहिए।

2

प्रयास करें:

typedef std::remove_reference<decltype(*this)>::type this_type; 
cout << is_same<this_type, A<int>>::value << endl; 

और शायद कुछ अन्य संदर्भों में remove_cv (यदि आप कोई परवाह नहीं है के बारे में const/volatile) इस तरह:

typedef std::remove_reference<decltype(*this)>::type this_type; 
typedef std::remove_cv<this_type>::type no_cv_this_type; 
cout << is_same<no_cv_this_type, A<int>>::value << endl; 
फिर
+2

और सुनिश्चित करें कि remove_cv * * remove_reference के बाद * है। –

+0

@ आर। मार्टिन्होफर्नैंड्स remove_reference के संपार्श्विक प्रभाव हैं? Remove_vference के बाद remove_cv का उपयोग करना क्यों नुकीला है? –

+0

@ पेरेगिंग-एलके क्योंकि ऑर्डर मायने रखता है। यहां देखें http://flamingdangerzone.com/cxx11/2012/05/29/type-traits-galore.html#bare_types –

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