Vấn đề này giải quyết vấn đề gì,
Xem câu trả lời của Dietmar và câu trả lời của nhãn hiệu lại .
và điều này có thay đổi cách hoạt động của các thùng chứa tiêu chuẩn không?
Không, không phải theo mặc định.
Quá tải mẫu hàm thành viên mới, find
v.v. cho phép bạn sử dụng một loại có thể so sánh với khóa của vùng chứa, thay vì sử dụng chính loại khóa. Xem N3465 của Joaquín Mª López Muñoz để biết cơ sở lý luận và một đề xuất chi tiết, được viết cẩn thận để thêm tính năng này.
Tại cuộc họp Bristol, LWG đã đồng ý rằng tính năng tra cứu không đồng nhất là hữu ích và đáng mong đợi, nhưng chúng tôi không thể chắc chắn rằng đề xuất của Joaquín sẽ an toàn trong mọi trường hợp. Đề xuất N3465 sẽ gây ra sự cố nghiêm trọng cho một số chương trình (xem phần Tác động đến mã hiện có ). Joaquín đã chuẩn bị một đề xuất dự thảo cập nhật với một số triển khai thay thế với các đánh đổi khác nhau, điều này rất hữu ích giúp LWG hiểu được những ưu và nhược điểm, nhưng tất cả đều có nguy cơ phá vỡ một số chương trình theo một cách nào đó nên không có sự đồng thuận để thêm tính năng. Chúng tôi quyết định rằng mặc dù sẽ không an toàn nếu thêm tính năng này vô điều kiện, nhưng sẽ an toàn nếu tính năng bị tắt theo mặc định và chỉ "chọn tham gia".
Sự khác biệt chính của đề xuất N3657 (là bản sửa đổi vào phút cuối của tôi và STL dựa trên N3465 và bản thảo chưa được xuất bản sau đó của Joaquín) là thêm is_transparent
loại làm giao thức có thể được sử dụng để chọn tham gia vào chức năng mới.
Nếu bạn không sử dụng "functor trong suốt" (tức là một cái xác định một is_transparent
loại) thì các vùng chứa sẽ hoạt động giống như chúng đã luôn làm và đó vẫn là mặc định.
Nếu bạn chọn sử dụng std::less<>
(mới cho C ++ 14) hoặc một loại "chức năng trong suốt" khác thì bạn sẽ có được chức năng mới.
Sử dụng std::less<>
dễ dàng với các mẫu bí danh:
template<typename T, typename Cmp = std::less<>, typename Alloc = std::allocator<T>>
using set = std::set<T, Cmp, Alloc>;
Tên is_transparent
này xuất phát từ N3421 của STL đã thêm "toán tử kim cương" vào C ++ 14. Một "hàm hàm trong suốt" là một hàm chấp nhận bất kỳ loại đối số nào (không nhất thiết phải giống nhau) và chỉ cần chuyển tiếp các đối số đó tới một toán tử khác. Một hàm như vậy sẽ trở thành chính xác những gì bạn muốn để tra cứu không đồng nhất trong các vùng chứa kết hợp, vì vậy loại is_transparent
này đã được thêm vào tất cả các toán tử kim cương và được sử dụng làm loại thẻ để chỉ ra chức năng mới sẽ được bật trong các vùng chứa liên kết. Về mặt kỹ thuật, các vùng chứa không cần "bộ điều khiển trong suốt", chỉ cần một bộ hỗ trợ gọi nó với các loại không đồng nhất (ví dụ: pointer_comp
loại trong https://stackoverflow.com/a/18940595/981959 không trong suốt theo định nghĩa của STL,pointer_comp::is_transparent
cho phép nó được sử dụng để giải quyết vấn đề). Nếu bạn chỉ tra cứu std::set<T, C>
bằng các khóa loại T
hoặc int
sau đó C
chỉ cần có thể gọi được với các đối số loại T
và int
(theo một trong hai thứ tự), thì nó không cần phải thực sự minh bạch. Chúng tôi đã sử dụng tên đó một phần vì chúng tôi không thể tìm ra một cái tên tốt hơn (tôi sẽ thích hơn is_polymorphic
vì những bộ chức năng như vậy sử dụng đa hình tĩnh, nhưng đã có một std::is_polymorphic
đặc điểm kiểu đề cập đến đa hình động).