2009-09-11 26 views
6

Là một theo dõi để this question: Tôi cần phải quyết định trong một chức năng lớp như thế này:Chức năng lớp Templated T: Làm thế nào để tìm ra nếu T là một con trỏ?

template< typename T > bool Class::Fun <T*> (T& variable) {...} 

dù T là một con trỏ hay không.

Trong câu hỏi được trích dẫn ở trên câu trả lời là sử dụng chuyên môn mẫu từng phần. Theo như tôi đã phát hiện ra điều này là không thể cho các chức năng lớp. Điều này có đúng không? Nếu vậy, có cách nào khác để tìm ra nếu T là một con trỏ?

+1

@iammilind: Bạn sẽ lưu ý rằng vấn đề đã được liên kết với các câu hỏi mà bạn đã đánh dấu nó là một bản sao của và nó cũng đã được tuyên bố ở đó về khía cạnh nào khác biệt. Vui lòng xóa "được đánh dấu là trùng lặp". – fuenfundachtzig

Trả lời

22

Không cần phải chuyên chức năng thành viên. Trong câu trả lời đó sử dụng cấu trúc độc lập. Bạn vẫn có thể sử dụng nó trong các hàm thành viên của lớp.

// stand-alone helper struct 
template<typename T> 
struct is_pointer { static const bool value = false; };  
template<typename T> 
struct is_pointer<T*> { static const bool value = true; }; 

// your class 
class Class{ 
public: 
template<typename T> 
void Fun(T& variable) { 
    std::cout << "is it a pointer? " << is_pointer<T>::value << std::endl; 
} 
}; 

Mặt khác, bạn có thể quá tải chức năng:

class Class { 
public: 
template<typename T> 
void Fun(T& variable) { 
    std::cout << "is it not a pointer! " << std::endl; 
} 
template<typename T> 
void Fun(T*& variable) { 
    std::cout << "is it a pointer! " << std::endl; 
} 
}; 
+2

Bạn đã thể hiện hai cách rất tốt để đạt được điều đó. Thật không may, tôi chỉ có một phiếu bầu cho bạn. ':)' – sbi

+0

Cảm ơn bạn đã khen ngợi, nhưng tôi muốn nói rằng tôi đã thể hiện các cách thông thường/tiêu chuẩn để đạt được điều đó. –

+2

Điều đó không có nghĩa là chúng không thể tốt lắm. ':)' – sbi

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