Яку проблему це вирішує,
Див відповідь Дітмар в і відповідь remyabel в .
і чи це змінює роботу стандартних контейнерів?
Ні, не за замовчуванням.
Нові шаблони функцій члена перевантаження find
тощо дозволяють використовувати тип, який можна порівняти з ключем контейнера, замість того, щоб використовувати сам тип ключа. Дивіться N3465 від Joaquín Mª López Muñoz щодо обґрунтування та детальної, ретельно написаної пропозиції щодо доповнення цієї функції.
На зустрічі в Брістолі LWG погодилася, що функція гетерогенного пошуку корисна і бажана, але ми не могли бути впевнені, що пропозиція Хоакіна буде безпечною у всіх випадках. Пропозиція N3465 спричинила б серйозні проблеми для деяких програм (див. Розділ « Вплив на існуючий код» ). Joaquín підготував оновлений проект пропозиції з деякими альтернативними варіантами реалізації з різними вигодами, що було дуже корисно, щоб допомогти LWG зрозуміти плюси і мінуси, але всі вони ризикували певним чином порушити деякі програми, тому не було єдиної думки додати цю функцію. Ми вирішили, що хоч би не було безпечно додавати цю функцію беззастережно, але було б безпечно, якщо вона була відключена за замовчуванням та лише "включення".
Ключова відмінність пропозиції N3657 (яка була останньою доопрацюванням власноруч і STL на основі N3465 та пізніше не опублікованого проекту Жоакіна ) полягала в тому, щоб додати is_transparent
тип як протокол, який можна використовувати для включення до нового функціоналу.
Якщо ви не використовуєте "прозорий функтор" (тобто той, який визначає is_transparent
тип), то контейнери поводяться так само, як це було завжди, і це все ще за замовчуванням.
Якщо ви вирішите використовувати std::less<>
(що є новим для C ++ 14) або іншим типом "прозорого функтора", тоді ви отримаєте нову функціональність.
Використання std::less<>
легко з шаблонами псевдонімів:
template<typename T, typename Cmp = std::less<>, typename Alloc = std::allocator<T>>
using set = std::set<T, Cmp, Alloc>;
Назва is_transparent
походить від N3421 STL, який додав "операторів з діамантами" до C ++ 14. "Прозорий функтор" - це той, який приймає будь-які типи аргументів (які не повинні бути однаковими) і просто пересилає ці аргументи іншому оператору. Такий функтор має бути саме тим, що ви хочете для неоднорідного пошуку в асоціативних контейнерах, тому тип is_transparent
додавали до всіх операторів алмазів і використовували як тип тегу для вказівки нової функціональності, слід активувати в асоціативних контейнерах. Технічно контейнерам не потрібен "прозорий функтор", а лише той, який підтримує виклик його з неоднорідними типами (наприклад, pointer_comp
тип https://stackoverflow.com/a/18940595/981959 не є прозорим відповідно до визначення STL,pointer_comp::is_transparent
дозволяє використовувати його для вирішення проблеми). Якщо ви коли-небудь шукаєте у своїх std::set<T, C>
ключах типу T
або int
тоді його C
потрібно називати лише аргументами типу T
та int
(в будь-якому порядку), це не потрібно бути справді прозорим. Ми використовували це ім'я частково, тому що не змогли придумати кращого імені (я б вважав is_polymorphic
за краще, тому що такі функціонери використовують статичний поліморфізм, але вже є std::is_polymorphic
типове ознака, яке відноситься до динамічного поліморфізму).