Melebihi beban operator() dalam C : Membongkar Kerumitan
Di alam C , amalan melebihkan operator() adalah lazim, terutamanya dalam konteks yang melibatkan panggilan balik. Pendekatan yang kelihatan tidak konvensional ini telah mendapat perhatian daripada pihak tertentu. Mari kita mendalami rasional di sebalik pilihan reka bentuk ini.
Melebihi beban operator() memenuhi tujuan utama mencipta functors—objek stateful yang berkelakuan serupa dengan fungsi tetapi mempunyai keupayaan tambahan untuk mengekalkan data dalaman antara seruan. Pertimbangkan contoh functor berikut:
struct Accumulator { int counter = 0; int operator()(int i) { return counter += i; } }; ... Accumulator acc; cout << acc(10) << endl; //prints "10" cout << acc(20) << endl; //prints "30"
Di sini, functor Accumulator mengumpul nilai, mencerminkan keadaannya melalui seruan operator().
Functors memainkan peranan penting dalam pengaturcaraan generik, di mana Algoritma STL direka bentuk untuk berfungsi dengan fungsi atau fungsi yang disediakan pengguna. Sebagai contoh, algoritma std::for_each menggunakan operasi yang diberikan kepada setiap elemen dalam julat:
template <typename InputIterator, typename Functor> void for_each(InputIterator first, InputIterator last, Functor f) { while (first != last) f(*first++); }
Algoritma ini menerima sama ada penunjuk fungsi atau functors melalui parameter f, membolehkan penyesuaian serba boleh.
Walaupun operator() memang boleh terlebih beban, ia mematuhi peraturan kaedah terlebih muatan. Ini bermakna berbilang beban lampau mesti berbeza dalam jenis pemulangan atau senarai parameter.
Atas ialah kandungan terperinci Mengapa Bebankan `operator()` dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!