Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menyimpan Penunjuk Fungsi Ahli dengan betul dalam Peta `std::function`?

Bagaimana untuk Menyimpan Penunjuk Fungsi Ahli dengan betul dalam Peta `std::function`?

Linda Hamilton
Lepaskan: 2024-12-21 01:00:10
asal
528 orang telah melayarinya

How to Correctly Store Member Function Pointers in a `std::function` Map?

Menyimpan Penunjuk Fungsi Ahli dalam std::function Map untuk Kelas Tunggal

Apabila cuba menyimpan penunjuk fungsi kepada fungsi ahli bagi sesuatu kelas dalam peta fungsi std::, adalah penting untuk memahami keperluan untuk fungsi ahli bukan statik dipanggil dengan objek.

Dalam kod yang disediakan, ralat berpunca daripada tandatangan fungsi std::function yang salah. Memandangkan fungsi ahli bukan statik sentiasa menghantar "ini" sebagai hujah tersirat, tandatangan harus diubah suai untuk memasukkan objek sebagai parameter pertama.

Coretan kod yang diperbetulkan ialah:

#include <functional>

class Foo {
public:
    void doSomething() {}
    void bindFunction() {
        // Correct
        std::function<void(Foo*)> f = &Foo::doSomething;
    }
};
Salin selepas log masuk

Untuk mengikat fungsi dengan parameter lagi, ruang letak C atau lambda C 11 boleh digunakan. Berikut ialah contoh untuk pendekatan ini:

Menggunakan Pemegang Tempat:

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

Menggunakan Lambdas (C 11):

std::function<void(Foo*, int, int)> f = [=](Foo* foo, int a, int b) {
    foo->doSomethingArgs(a, b);
};
Salin selepas log masuk

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

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan