Bind vs. Lambda: Meneroka Perbezaan dan Kesesuaian Mereka
Dalam C 0x, pembangun mempunyai pilihan untuk menggunakan sama ada ungkapan lambda atau std: :bind untuk menyelesaikan tugas pengaturcaraan tertentu. Walaupun kedua-dua teknik berkongsi beberapa persamaan, kesesuaian mereka dalam senario tertentu mungkin berbeza dengan ketara.
Contoh Kefungsian Bersilang
Mari kita pertimbangkan contoh kefungsian bersilang antara lambda dan bind. Katakan kita mempunyai keperluan untuk menjana nombor rawak menggunakan enjin. Menggunakan lambda, kita boleh merangkum logik yang diperlukan seperti berikut:
<code class="cpp">uniform_int<> distribution(1, 6); mt19937 engine; // lambda style auto dice = [&]() { return distribution(engine); };</code>
Sebagai alternatif, menggunakan std::bind, kita boleh mencapai hasil yang sama:
<code class="cpp">uniform_int<> distribution(1, 6); mt19937 engine; // bind style auto dice = bind(distribution, engine);</code>
Monomorfisme lwn. Polimorfisme
Perbezaan utama antara ungkapan lambda dan std::bind terletak pada keupayaan polimorfismenya. Ungkapan Lambda dalam C 0x adalah monomorfik, bermakna hujah mereka mesti mempunyai jenis yang diketahui. Pengehadan ini boleh dihadapi apabila bekerja dengan fungsi generik yang menerima hujah pelbagai jenis.
Sebagai contoh, pertimbangkan lambda berikut:
<code class="cpp">auto f = [](auto a, auto b) { cout << a << ' ' << b; }
Menggunakan lambda ini memerlukan penentuan jenis a dan b pada masa penyusunan. Ini boleh menjadi sekatan dalam situasi di mana jenis tidak diketahui lebih awal.
Sebaliknya, std::bind membenarkan tingkah laku polimorfik. Dengan menggunakan Phoenix/lambda bind, pembangun boleh mentakrifkan fungsi yang menerima argumen pelbagai jenis, seperti yang ditunjukkan dalam contoh di bawah:
<code class="cpp">struct foo { typedef void result_type; template < typename A, typename B > void operator()(A a, B b) { cout << a << ' ' << b; } }; auto f = bind(foo(), _1, _2);</code>
Dalam kes ini, jenis argumen a dan b disimpulkan pada masa jalan, memberikan fleksibiliti yang lebih besar.
Kebaikan dan Kelemahan
Untuk meringkaskan kelebihan dan kekurangan setiap pendekatan:
Ekspresi Lambda:
std::bind:
Kesimpulan
Pilihan antara ungkapan std::bind dan lambda dalam C 0x bergantung pada keperluan khusus aplikasi. Untuk senario monomorfik, lambdas menawarkan pendekatan yang mudah dan ringkas. Untuk senario polimorfik di mana jenis hujah boleh berbeza-beza secara dinamik, std::bind memberikan fleksibiliti yang lebih besar. Memahami kekuatan dan kelemahan kedua-dua teknik membolehkan pembangun membuat keputusan termaklum semasa membuat kod mereka.
Atas ialah kandungan terperinci Lambda lwn. `std::bind`: Bilakah Anda Harus Menggunakan Setiap dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!