Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menyimpan Penunjuk Fungsi Ahli dalam Objek `std::function` Generik?

Bagaimana untuk Menyimpan Penunjuk Fungsi Ahli dalam Objek `std::function` Generik?

Linda Hamilton
Linda Hamiltonasal
2024-12-23 20:39:10262semak imbas

How to Store Member Function Pointers in Generic `std::function` Objects?

Menyimpan Penunjuk Fungsi Ahli dalam Objek Generik std::function

Apabila cuba menyimpan penunjuk fungsi ahli kelas tertentu dalam peta menggunakan std::function objects, pembangun mungkin menghadapi ralat: "term does not evaluate to a function taking 0 arguments." Ralat ini timbul apabila menugaskan penuding fungsi ahli terus kepada objek std::function.

Inti isu terletak pada fakta bahawa fungsi ahli bukan statik memerlukan penuding "ini" tersirat sebagai hujah pertama . Untuk membetulkan ini, hujah pertama mesti terikat secara eksplisit.

Penyelesaian:

std::function<void(void)> f = std::bind(&Foo::doSomething, this);

Pendekatan ini secara berkesan mengikat penunjuk "ini" sebagai hujah pertama, membenarkan objek std::function untuk menangkap fungsi ahli dengan betul.

Fungsi Pengendalian dengan Parameter:

Untuk fungsi ahli dengan parameter, ruang letak mesti dinyatakan untuk menunjukkan kedudukan argumen terikat.

using namespace std::placeholders;
std::function<void(int, int)> f = std::bind(&Foo::doSomethingArgs,
                                                 this,
                                                 std::placeholders::_1,
                                                 std::placeholders::_2);

C 11 Lambda Syntax:

Jika pengkompil menyokong C 11 lambdas, pendekatan yang lebih ringkas boleh digunakan:

std::function<void(int, int)> f = [=](int a, int b) {
    this->doSomethingArgs(a, b);
};

Dengan mengikuti teknik ini, pembangun boleh menyimpan dan menggunakan penunjuk fungsi ahli dengan berkesan menggunakan objek std::fungsi generik.

Atas ialah kandungan terperinci Bagaimana untuk Menyimpan Penunjuk Fungsi Ahli dalam Objek `std::function` Generik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn