2015-06-23 18 views
7

tôi đang học SFINAE (Thay thất bại không phải là) Tôi tìm thấy một ví dụ về nó trong một trang web,là gì "Class :: *"

template<typename T> 
class is_class { 
    typedef char yes[1]; 
    typedef char no [2]; 
    template<typename C> static yes& test(int C::*); // What is C::*? 
    template<typename C> static no& test(...); 
    public: 
    static bool const value = sizeof(test<T>(0)) == sizeof(yes); 
}; 

Tôi tìm thấy một chữ ký mới, int C::* ở dòng 5 Lúc đầu, tôi nghĩ rằng đó là operator* nhưng tôi cho rằng điều đó không đúng. Hãy cho tôi biết nó là gì.

+0

câu hỏi tương tự: http://stackoverflow.com/questions/670734/c-pointer-to-class-data-member – Havenard

+0

Tôi xin lỗi hỏi một câu hỏi tương tự. Tôi đã cố gắng tìm kiếm nó bằng từ khóa ":: *" nhưng tôi không thể tìm thấy nó. Và cảm ơn bạn đã cho tôi biết liên kết đến câu hỏi tương tự. – mora

Trả lời

6

int C::* là con trỏ tới thành viên của lớp C có loại là int.

Ví dụ:

struct C 
{ 
    C() : a(0), b(0) {} 
    int a; 
    int b; 
}; 

int main() 
{ 
    int C::*member1 = &C::a; 
    int C::*member2 = &C::b; 
    C c1; 
    c1.*member1 = 10; // Sets the value of c1.a to 10 
    c1.*member2 = 20; // Sets the value of c1.b to 20 
} 
+0

Cảm ơn bạn rất nhiều, R Sahu. Nó mới cho tôi. Hãy để tôi hỏi bạn nhiều hơn. Đây có phải là từ khóa đặc biệt như từ khóa "này" không? Liệu nó tồn tại bất cứ lúc nào ngay cả khi lớp học không có thành viên? Cảm ơn bạn rất nhiều một lần nữa. – mora

+0

Loại tồn tại ngay cả khi một lớp học không có thành viên nhưng bạn không thể khởi tạo nó để trỏ đến một thành viên. Ví dụ, bạn có thể sử dụng 'float C :: * member3 = nullptr;'. Vì 'C' không có thành viên kiểu' float', 'member3' không thể trỏ đến thành viên' C'. –

+0

@mora Không phải từ khóa, cú pháp ngôn ngữ của nó, là một cơ chế cho phép bạn chỉ định một con trỏ tới một thành viên của một lớp. Điều gì làm cho nó đặc biệt là nó không phải là một con trỏ đến một thành viên của một đối tượng cụ thể, nhưng một con trỏ tốt cho cùng một thành viên của bất kỳ đối tượng nào của cùng một lớp đó. Tôi thành thật không thể nghĩ về bất kỳ sử dụng thực tế cho thợ cơ khí này, nhưng ngôn ngữ cung cấp nó nếu cần thiết. – Havenard

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