Rumah >pembangunan bahagian belakang >C++ >Bagaimana Menggunakan Penunjuk Fungsi Ahli dengan betul dengan fungsi std::?

Bagaimana Menggunakan Penunjuk Fungsi Ahli dengan betul dengan fungsi std::?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-20 13:40:101007semak imbas

How to Correctly Use Member Function Pointers with std::function?

Cara Mengendalikan Penunjuk Fungsi Ahli dalam Objek std::function

Apabila bekerja dengan fungsi ahli dalam objek std::fungsi, komplikasi tertentu boleh timbul. Pertimbangkan kod berikut:

#include <functional>

class Foo {
public:
    void doSomething() {}
    void bindFunction() {
        // ERROR
        std::function<void(void)> f = &Foo::doSomething;
    }
};

Ralat timbul kerana fungsi ahli bukan statik secara tersirat menghantar penunjuk "ini" sebagai hujah. Walau bagaimanapun, tandatangan std::function di sini tidak mengambil kira hujah ini.

Penyelesaian: Mengikat Fungsi Ahli kepada std::function Objects

Untuk menangani isu ini, hujah pertama ("ini") mesti terikat secara eksplisit:

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

Untuk fungsi dengan parameter, ruang letak boleh digunakan:

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

Dalam C 11, lambdas juga boleh digunakan:

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

Dengan menggabungkan teknik ini, pengaturcara boleh berjaya bekerja dengan penunjuk fungsi ahli dalam std:: objek fungsi, menguruskan hujah "ini" tersirat dengan berkesan.

Atas ialah kandungan terperinci Bagaimana Menggunakan Penunjuk Fungsi Ahli dengan betul dengan fungsi std::?. 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