Melaksanakan std::function untuk Kebolehpanggil Serbaguna
Fungsi std:: menyediakan cara untuk merangkum dan menyimpan sebarang jenis boleh panggil sambil mengekalkan saiz tetap. Walaupun saiz kandungannya yang berbeza-beza, seperti ungkapan lambda, fungsi std::mencapai ketekalan ini melalui teknik yang dikenali sebagai pemadaman jenis.
Pemadaman Jenis untuk Boleh Dipanggil Pelbagai
Pemadaman jenis melibatkan penciptaan antara muka biasa yang diwakili oleh kelas asas. Dalam kes std::function, kelas callable_base mentakrifkan operator fungsi maya() yang dilaksanakan oleh kelas terbitan untuk jenis boleh panggil tertentu. Pendekatan ini membolehkan std::function menyimpan penuding ke kelas asas, membenarkan ia membalut mana-mana boleh dipanggil.
Oleh kerana setiap boleh dipanggil mungkin mempunyai pelaksanaan yang berbeza, kelas terbitan dicipta secara dinamik dengan std::function mengurus peruntukan dalam timbunan.
Salin Gelagat dan Dalaman Nyatakan
Apabila menyalin fungsi std::, entiti boleh panggil dalaman disalin, bukannya dikongsi. Tingkah laku ini terbukti dalam ujian berikut:
int main() { int value = 5; typedef std::function<void()> fun; fun f1 = [=]() mutable { std::cout << value++ << '\n'; }; fun f2 = f1; f1(); // prints 5 fun f3 = f1; f2(); // prints 5 f3(); // prints 6 (copy after first increment) }
Kenaikan selepas panggilan pertama ke f1 tidak menjejaskan f2, yang menunjukkan bahawa f2 mempunyai salinan entiti boleh panggil sendiri.
Atas ialah kandungan terperinci Bagaimanakah `std::function` Mencapai Kebolehpanggil Serbaguna dengan Saiz Konsisten?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!