Masalah apa yang diselesaikan ini,
Lihat jawaban Dietmar dan jawaban remyabel .
dan apakah ini mengubah cara kerja wadah standar?
Tidak, tidak secara default.
Kelebihan template fungsi anggota baru find
dll. Memungkinkan Anda menggunakan jenis yang sebanding dengan kunci penampung, alih-alih menggunakan jenis kunci itu sendiri. Lihat N3465 oleh Joaquín Mª López Muñoz untuk alasan dan detail, proposal yang ditulis dengan cermat untuk menambahkan fitur ini.
Pada pertemuan Bristol, POKJA setuju bahwa fitur pencarian heterogen berguna dan diinginkan, tetapi kami tidak dapat memastikan bahwa proposal Joaquín akan aman di semua kasus. Proposal N3465 akan menyebabkan masalah serius untuk beberapa program (lihat bagian Dampak pada kode yang ada ). Joaquín menyiapkan draf proposal yang diperbarui dengan beberapa implementasi alternatif dengan trade-off yang berbeda, yang sangat berguna membantu POKJA memahami pro dan kontra, tetapi mereka semua berisiko melanggar beberapa program dengan cara tertentu sehingga tidak ada konsensus untuk menambahkan fitur tersebut. Kami memutuskan bahwa meskipun tidak aman menambahkan fitur tanpa syarat, akan aman jika dinonaktifkan secara default dan hanya "ikut serta".
Perbedaan utama dari proposal N3657 (yang merupakan revisi menit-menit terakhir oleh saya sendiri dan STL berdasarkan N3465 dan draf yang kemudian tidak diterbitkan oleh Joaquín) adalah menambahkan is_transparent
jenis sebagai protokol yang dapat digunakan untuk ikut serta ke fungsi baru.
Jika Anda tidak menggunakan "transparent functor" (yaitu yang mendefinisikan sebuah is_transparent
tipe) maka kontainer akan berperilaku sama seperti yang biasa mereka lakukan, dan itu masih default.
Jika Anda memilih untuk menggunakan std::less<>
(yang baru untuk C ++ 14) atau jenis "functor transparan" lainnya maka Anda mendapatkan fungsionalitas baru.
Penggunaannya std::less<>
mudah dengan templat alias:
template<typename T, typename Cmp = std::less<>, typename Alloc = std::allocator<T>>
using set = std::set<T, Cmp, Alloc>;
Namanya is_transparent
berasal dari STL's N3421 yang menambahkan "operator berlian" ke C ++ 14. Sebuah "functor transparan" adalah salah satu yang menerima semua jenis argumen (yang tidak harus sama) dan hanya meneruskan argumen tersebut ke operator lain. Functor seperti itu kebetulan persis seperti yang Anda inginkan untuk pencarian heterogen dalam wadah asosiatif, sehingga jenisnya is_transparent
ditambahkan ke semua operator berlian dan digunakan sebagai jenis tag untuk menunjukkan fungsionalitas baru yang harus diaktifkan dalam wadah asosiatif. Secara teknis, kontainer tidak memerlukan "fungsi transparan", hanya satu yang mendukung pemanggilan dengan tipe heterogen (mis. pointer_comp
Tipe di https://stackoverflow.com/a/18940595/981959 tidak transparan menurut definisi STL,pointer_comp::is_transparent
memungkinkannya digunakan untuk memecahkan masalah). Jika Anda hanya pernah lookup di Anda std::set<T, C>
dengan tombol jenis T
atau int
kemudian C
hanya perlu callable dengan argumen tipe T
dan int
(dalam rangka baik), tidak perlu untuk benar-benar transparan. Kami menggunakan nama itu sebagian karena kami tidak dapat menemukan nama yang lebih baik (saya lebih suka is_polymorphic
karena fungsi tersebut menggunakan polimorfisme statis, tetapi sudah ada std::is_polymorphic
sifat tipe yang mengacu pada polimorfisme dinamis).