2012-12-12 39 views
5

Tại sao mã này tạo ra kết quả sai?Chức năng mẫu is_same trong các lớp mẫu

//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; 
} 

Output:

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

Các loại "* này" bên A đến B là một int <>, phải không?

Trả lời

8

*this là giá trị của loại A, vì vậy decltype(*this) sẽ cung cấp loại tham chiếu A &. Nhớ lại rằng decltype trên một giá trị trái cung cấp cho các loại tài liệu tham khảo:

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

Output:

false 
true 
+0

Sau đó, loại hoàn toàn 'này' là gì, 'A & * this'? –

+0

Chắc chắn không rõ ràng. –

+0

Dòng cuối cùng không hoạt động đối với tôi. Đầu ra của tôi là 'false', 'true', 'false' (g ++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2) –

0

Bạn có chắc chắn decltype(*this) là A? Bạn nên điều tra về điều đó với một dòng gỡ lỗi cout xấu xí.

2

Hãy thử:

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

và có thể remove_cv trong một số bối cảnh khác (nếu bạn không quan tâm đến const/volatile) như thế này:

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

Và đảm bảo remove_cv là * sau * remove_reference. –

+0

@ R.MartinhoFernandes remove_reference có tác dụng phụ? Tại sao nó là cần thiết để sử dụng remove_cv "sau" remove_reference? –

+0

@ Peregring-lk vì thứ tự quan trọng. Xem ở đây http://flamingdangerzone.com/cxx11/2012/05/29/type-traits-galore.html#bare_types –

Các vấn đề liên quan