Penunjuk Fungsi kepada Fungsi Ahli dengan Fungsi Perpustakaan Standard
Dalam percubaan untuk menyimpan penunjuk fungsi kepada fungsi ahli kelas dalam peta yang mengandungi objek fungsi perpustakaan standard, ralat biasa timbul. Seperti yang ditunjukkan dalam kod di bawah, memberikan fungsi ahli secara langsung kepada objek fungsi mengakibatkan ralat:
#include <functional> class Foo { public: void doSomething() {} void bindFunction() { // ERROR std::function<void(void)> f = &Foo::doSomething; } };
Ralat yang dihadapi adalah disebabkan oleh keperluan tersirat fungsi ahli untuk objek. Fungsi ahli sentiasa dipanggil dengan objek, dengan berkesan menghantar penuding "ini" sebagai hujah pertamanya.
Untuk menyelesaikan isu ini, tandatangan fungsi mesti menyatakan bahawa fungsi itu tidak mengambil sebarang hujah (< void(void)>). Selain itu, hujah pertama (dan sahaja) mesti terikat. Ini boleh dicapai menggunakan std::bind():
std::function<void(void)> f = std::bind(&Foo::doSomething, this);
Jika fungsi memerlukan parameter, ruang letak boleh digunakan:
using namespace std::placeholders; std::function<void(int, int)> f = std::bind(&Foo::doSomethingArgs, this, std::placeholders::_1, std::placeholders::_2);
C 11 lambda juga boleh digunakan:
std::function<void(int, int)> f = [=](int a, int b) { this->doSomethingArgs(a, b); };
Atas ialah kandungan terperinci Bagaimana untuk Menyimpan Penunjuk Fungsi Ahli dalam Objek Fungsi Perpustakaan Standard?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!