2010-03-17 34 views
7

đề cập đến bài đăng hôm qua, điều này đánh thức tôi dậy sáng nay. Tại sao điều này thực sự hiệu quả? Miễn là chức năng test có liên quan, chức năng này không có cơ thể để làm thế nào nó có thể thực hiện bất cứ điều gì? Tôi muốn biết tại sao và cách thức hoạt động của nó? Tôi thực sự quan tâm để xem câu trả lời của bạn.Tại sao tính năng này hoạt động (Mẫu, SFINAE). C++

template<typename T> 
class IsClassT { 
    private: 
    typedef char One; 
    typedef struct { char a[2]; } Two; 
    template<typename C> static One test(int C::*); //NO BODY HERE 
    template<typename C> static Two test(…); //NOR HERE 
    public: 
    enum { Yes = sizeof(IsClassT<T>::template test<T>(0)) == sizeof(One) }; 
    enum { No = !Yes }; 
}; 

Cảm ơn trước với sự giúp đỡ để hiểu hiện tượng rất thú vị này.

+0

Đối với Standardese, xem '3.2/2' và' 3.2/3' (cả về nghĩa của "sử dụng" và hậu quả của "sử dụng "một cái gì đó). –

Trả lời

6

Tôi giả sử bạn đang đề cập đến Có enum? IsClassT<T>::test<T>(0)? sizeof không thực sự đánh giá các đối số của nó. Đó là lý do tại sao mã như sau là hợp pháp, mặc dù bạn có thể mong đợi nó để giải cứu về bạn:

int* p = 0; 
int sizeof_int = sizeof(*p); //oops, p is 0 :(
+0

Những gì tôi thực sự quan tâm là lý do tại sao mặc dù thử nghiệm không có cơ thể tôi nhận được không có lỗi cho điều này? –

+7

Vì kiểu trả về được biết tại thời gian biên dịch mà không có phần thân. Nó chỉ đơn giản là một 'char' hoặc' char [2] '. Đó là tất cả các nhu cầu của trình biên dịch, và nó bị xử phạt theo tiêu chuẩn. Để rõ ràng, 'sizeof' áp dụng cho giá trị trả về của hàm (không, ví dụ: kích thước mã của hàm) và để tính toán rằng bạn chỉ cần biết loại, không có đối tượng thực sự thuộc loại đó. – Ari

8
  1. Bạn không thể nhận được lỗi biên dịch vì test -function khai tồn tại.

  2. Bạn không thể gặp lỗi trình liên kết vì bạn không gọitest -function.

C++ Standart ISO/IEC 14882: 2003 (E)

5.3.3 sizeof

Nhà điều hành sizeof mang lại số byte trong các đại diện đối tượng của toán hạng của nó . Toán hạng là một biểu thức, trong đó không được đánh giá hoặc id loại được gắn dấu ngoặc đơn. Nhà điều hành sizeof thì không ...

...

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