Sau khi trả lời this câu hỏi Tôi đã cố gắng tìm mẫu is_complete
trong thư viện Tăng cường và tôi nhận ra rằng không có mẫu nào trong Boost.TypeTraits. Tại sao không có mẫu như vậy trong thư viện Boost? Nó trông như thế nào?Làm thế nào để viết mẫu `is_complete`?
//! Check whether type complete
template<typename T>
struct is_complete
{
static const bool value = (sizeof(T) > 0);
};
...
// so I could use it in such a way
BOOST_STATIC_ASSERT(boost::is_complete<T>::value);
Đoạn mã trên là không đúng, bởi vì nó là bất hợp pháp để áp dụng sizeof
đến một loại không đầy đủ. Điều gì sẽ là một giải pháp tốt? Có thể áp dụng SFINAE trong trường hợp này không?
Vâng, vấn đề này không thể giải quyết nói chung mà không vi phạm các ODR rule, nhưng có là có một nền tảng cụ thể solution mà làm việc cho tôi.
tôi nghĩ rằng đây có thể không làm việc theo nguyên tắc (trừ khi bạn luôn áp dụng nó cho một loại luôn luôn không đầy đủ, hoặc luôn luôn hoàn thành). Bởi vì liệu 'U' có hoàn thành hay không,' is_complete 'luôn luôn chỉ định cùng một loại. Nếu bây giờ bạn đi và sử dụng 'is_complete ' trong hai đơn vị dịch khác nhau, thành viên giá trị có thể có giá trị khác nhau mỗi lần và trình biên dịch miễn phí với giá trị nào nó sử dụng. Đây không phải là hợp lệ tôi nghĩ, nhưng tôi không thể tìm thấy một tuyên bố của các tiêu chuẩn về việc này: (Sẽ được vui mừng nếu bạn có thể tìm hiểu. –
Câu hỏi lớn hơn là lý do tại sao. Thời gian biên dịch –
Cũng không có cách nào trong C++ 03 điều này có thể được thực hiện.Đầu tiên với C++ 0x với "sfinae cho biểu thức", nhưng thậm chí nếu bạn chuyển 'vector' cho ví dụ và 'vector' chỉ được khai báo nhưng không được xác định, sau đó kiểm tra tính đầy đủ sẽ mang lại cho một sự khởi tạo ngầm định, và nếu định nghĩa không có sẵn sẽ phát hành một lỗi cứng mà không được bao hàm bởi sfinae (lỗi không nằm trong "bối cảnh ngay lập tức") –