5

Tôi biết về std::is_pod. Nhưng nó kiểm tra nhiều hơn chỉ là các loại tổng hợp. Hoặc, là std::is_pod chỉ là điều tốt nhất chúng ta có thể làm?Làm thế nào để kiểm tra xem T là một loại tổng hợp?

Về cơ bản, tôi muốn viết một hàm template cho this:

template <typename T> 
aggregate_wrapper<T> wrap(T&& x); 

mà chỉ được kích hoạt khi T là một loại tổng hợp.

+2

Tôi không thể nghĩ ra bất kỳ ứng dụng thực tế nào của 'is_aggregate'. Ví dụ. nó không giúp với serialization. –

+1

Nếu bạn đang tìm kiếm loại đặc điểm cho bạn biết khi nào, ví dụ: 'memcpy' là an toàn, sau đó bạn muốn [' std :: is_trivially_copyable'] (http://en.cppreference.com/w/cpp/types/is_trivially_copyable). – ildjarn

+2

@ Cheersandhth.-Alf Tôi muốn viết một mẫu hàm 'wrap()' cho [this] (http://codereview.stackexchange.com/q/117744/70823), chỉ được bật nếu 'T' là một loại tổng hợp. – Lingxi

Trả lời

4

Không có cách nào để tổng hợp mẫu is_aggregate. Các quy tắc cho dù một cái gì đó tham gia vào khởi tạo tổng hợp không thể được phát hiện bởi C++ 14 kỹ thuật lập trình meta (họ sẽ yêu cầu hỗ trợ phản chiếu).

Lý do chung cho việc không có điều này là thiếu nhu cầu rõ ràng. Ngay cả trong trường hợp của your wrapper, có ít gây hại khi áp dụng nó cho các loại không tổng hợp, vì cú pháp khởi tạo đồng nhất có thể được áp dụng cho không tổng hợp. Bạn sẽ thực hiện tất cả các chuyển đổi không phải là explicit, nhưng đó là một thứ có thể được khắc phục thông qua lập trình meta metaprogramming/enable_if thể dục.

Nơi hữu ích nhất cho một thứ như vậy sẽ là allocator::construct, cho phép bạn sử dụng tổng hợp khởi tạo để xây dựng đối tượng nếu số T là tổng hợp, trong khi sử dụng các hàm gọi trực tiếp khác (để tránh phần "không đồng nhất") khởi tạo thống nhất).

+0

Sau một suy nghĩ thứ hai, viết một 'wrap()' như thế này có thể không phải là một ý tưởng hay. Với tổng hợp, bạn không thể thực sự biết liệu người dùng có muốn tạo một 'aggregate_wrapper' hay cái gì khác chỉ với' wrap (x) '. – Lingxi

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