Câu hỏi của tôi: Liệu chúng ta có thể xây dựng các thư viện thư viện tiêu chuẩn (hiện có) với bất kỳ phạm vi nào không? Và quan trọng hơn, với tầm nhìn phạm vi?
Không. Thành phần thư viện tiêu chuẩn duy nhất có thể xây dựng từ một phạm vi tùy ý đáp ứng các tiêu chí chính xác là std::span<T>
.
Hướng mà thư viện chuẩn có thể sẽ đi theo hướng mà phạm vi-v3 cũng sẽ hướng tới (lưu ý rằng ví dụ được liên kết từ phạm vi-v3 không biên dịch nhưng cảnh báo về chuyển đổi không dùng nữa) - sử dụng trình trợ giúp để thực hiện chuyển đổi cho bạn:
std::vector<int> squares =
std::ranges::views::transform(vec, sq) | std::ranges::to<std::vector>;
Một trong những lý do để không đi theo hướng của các nhà xây dựng phạm vi có thể được nhìn thấy từ chính ví dụ bạn đang sử dụng:
std::vector<int> squares { std::ranges::views::transform(vec, sq) };
Xem xét sự khác biệt của tuyên bố đó từ hai:
std::vector v { std::ranges::views::transform(vec, sq) };
std::vector w ( std::ranges::views::transform(vec, sq) );
v
sẽ nhất thiết phải là một vector<transform_view<...>>
chứa một transform_view
, trong khi w
sẽ là một vector<int>
.
Hơn nữa, việc thêm nhiều hơn, các hàm tạo container bị ràng buộc cẩn thận vào thư viện chuẩn sẽ không giúp ích gì cho các loại container của bên thứ ba - trong khi một cơ sở như ranges::to
hoạt động hoàn toàn tốt trong mọi trường hợp.