Untuk satu kelas saya ingin menyimpan beberapa pointer fungsi ke fungsi anggota dari kelas yang sama dalam satu objek map
penyimpanan std::function
. Tapi saya gagal sejak awal dengan kode ini:
class Foo {
public:
void doSomething() {}
void bindFunction() {
// ERROR
std::function<void(void)> f = &Foo::doSomething;
}
};
Saya menerima error C2064: term does not evaluate to a function taking 0 arguments
di xxcallobj
dikombinasikan dengan beberapa kesalahan template yang Instansiasi aneh. Saat ini saya bekerja pada Windows 8 dengan Visual Studio 2010/2011 dan pada Win 7 dengan VS10 gagal juga. Kesalahan harus didasarkan pada beberapa aturan C ++ aneh yang tidak saya ikuti
std::function
, dengan tambahanthis
sebagai parameter pertama, sepertistd::function<void(Foo*, int, int)> = &Foo::doSomethingArgs
Apa pun yang Anda butuhkan
sehingga Anda dapat memanggilnya pada contoh apa pun, atau Anda harus mengikat contoh tertentu, misalnya
this
sumber
this
?Jika Anda perlu menyimpan fungsi anggota tanpa instance kelas, Anda dapat melakukan sesuatu seperti ini:
Seperti apa bentuk penyimpanan tanpa otomatis ? Sesuatu seperti ini:
Anda juga dapat meneruskan penyimpanan fungsi ini ke penjilidan fungsi standar
Catatan masa lalu dan masa depan: Antarmuka yang lebih lama std :: mem_func ada, tetapi sejak itu sudah tidak digunakan lagi. Ada proposal, posting C ++ 17, untuk membuat pointer ke fungsi anggota dapat dipanggil . Ini akan sangat disambut.
sumber
std::mem_fn
itu tidak dihapus; banyak kelebihan yang tidak perlu. Di sisi lainstd::mem_fun
sudah ditinggalkan dengan C ++ 11 dan akan dihapus dengan C ++ 17.template<class R, class T> unspecified mem_fn(R T::*);
dan itu tidak akan hilang.Sayangnya, C ++ tidak memungkinkan Anda untuk secara langsung mendapatkan objek yang dapat dipanggil yang merujuk ke objek dan salah satu fungsi anggotanya.
&Foo::doSomething
memberi Anda "pointer ke fungsi anggota" yang mengacu pada fungsi anggota tetapi bukan objek terkait.Ada dua cara untuk mengatasi hal ini, satu digunakan
std::bind
untuk mengikat "fungsi pointer ke anggota" kethis
pointer. Yang lainnya adalah menggunakan lambda yang menangkapthis
pointer dan memanggil fungsi anggota.Saya lebih suka yang terakhir.
Dengan g ++ setidaknya mengikat fungsi anggota ke ini akan menghasilkan objek tiga-pointer dalam ukuran, menugaskan ini
std::function
akan menghasilkan alokasi memori dinamis.Di sisi lain, lambda yang menangkap
this
hanya berukuran satu pointer, menugaskannya ke tidakstd::function
akan menghasilkan alokasi memori dinamis dengan g ++.Walaupun saya belum memverifikasi ini dengan kompiler lain, saya menduga hasil yang sama akan ditemukan di sana.
sumber
Anda dapat menggunakan functors jika Anda ingin kontrol yang kurang umum dan lebih tepat di bawah tenda. Contoh dengan api win32 saya untuk meneruskan pesan api dari suatu kelas ke kelas lain.
IListener.h
Listener.h
Dispatcher.h
Prinsip penggunaan
Selamat mencoba dan terima kasih untuk semua yang telah berbagi pengetahuan
sumber
Anda dapat menghindari
std::bind
melakukan ini:sumber