Tôi đang cố gắng hiểu việc triển khai std::is_class
. Tôi đã sao chép một số triển khai có thể và biên dịch chúng, hy vọng tìm ra cách chúng hoạt động. Điều đó được thực hiện, tôi thấy rằng tất cả các tính toán được thực hiện trong quá trình biên dịch (như tôi đã tìm ra sớm hơn, nhìn lại), vì vậy gdb có thể cho tôi biết thêm chi tiết về chính xác những gì đang diễn ra.Cách triển khai này của std :: is_class hoạt động như thế nào?
Việc thực hiện tôi đang đấu tranh để hiểu là một trong những điều này:
template<class T, T v>
struct integral_constant{
static constexpr T value = v;
typedef T value_type;
typedef integral_constant type;
constexpr operator value_type() const noexcept {
return value;
}
};
namespace detail {
template <class T> char test(int T::*); //this line
struct two{
char c[2];
};
template <class T> two test(...); //this line
}
//Not concerned about the is_union<T> implementation right now
template <class T>
struct is_class : std::integral_constant<bool, sizeof(detail::test<T>(0))==1
&& !std::is_union<T>::value> {};
Tôi đang gặp rắc rối với hai nhận xét dòng. Dòng đầu tiên:
template<class T> char test(int T::*);
T::*
có nghĩa là gì? Ngoài ra, đây không phải là một tuyên bố chức năng? Nó trông giống như một, nhưng điều này biên dịch mà không xác định một cơ quan chức năng.
Dòng thứ hai tôi muốn hiểu là:
template<class T> two test(...);
Một lần nữa, đây không phải là khai báo hàm không có cơ thể bao giờ được xác định? Ngoài ra, dấu ba chấm có ý nghĩa gì trong ngữ cảnh này? Tôi nghĩ rằng một dấu ba chấm như một đối số chức năng yêu cầu một đối số được xác định trước ...
?
Tôi muốn hiểu mã này đang làm gì. Tôi biết tôi chỉ có thể sử dụng các chức năng đã được triển khai từ thư viện chuẩn, nhưng tôi muốn hiểu cách chúng hoạt động.
Tài liệu tham khảo:
Chức năng * khai báo * không chứa nội dung. Đó là cho các định nghĩa. –
Định nghĩa hàm là khai báo hàm, Karoly. Nit bạn chọn là tất cả các định nghĩa đều là khai báo, nhưng không phải tất cả các khai báo đều là các định nghĩa. – Peter