Mendapatkan Parameter dan Jenis Pengembalian Lambda
Dalam ungkapan lambda, menentukan parameter dan jenis pulangan boleh menjadi penting untuk fungsi yang menerima lambda sebagai argumen. Mari kita terokai kebolehlaksanaan tugas ini dan pendekatan untuk mencapainya.
Ciri Lambda
Untuk mendapatkan parameter dan jenis pengembalian lambda, adalah dicadangkan untuk menentukan templat lambda_traits yang boleh digunakan seperti berikut:
auto lambda = [](int i) { return long(i*10); }; lambda_traits<decltype(lambda)>::param_type i; //i should be int lambda_traits<decltype(lambda)>::return_type l; //l should be long
Dengan memanfaatkan lambda_traits, fungsi boleh mengintrospeksi parameter dan mengembalikan jenis lambda yang diterima sebagai argumen, membolehkan kefungsian lanjutan seperti:
template<typename TLambda> void f(TLambda lambda) { typedef typename lambda_traits<TLambda>::param_type P; typedef typename lambda_traits<TLambda>::return_type R; std::function<R(P)> fun = lambda; //I want to do this! //... }
Menggunakan decltype untuk Introspeksi Jenis Parameter
Mujurlah, adalah mungkin untuk mendapatkan semula jenis parameter menggunakan decltype operator lambda(). Teknik ini ditunjukkan dengan elegan dalam pelaksanaan function_traits berikut:
template <typename T> struct function_traits : public function_traits<decltype(&T::operator())> {};
Untuk lambda generik, function_traits secara langsung menggunakan tandatangan operatornya(). Untuk penunjuk fungsi ahli, ia mengkhususkan dan menyediakan jenis arity, result_type dan argumen.
Contoh Penggunaan
Pertimbangkan contoh berikut:
int main() { auto lambda = [](int i) { return long(i*10); }; typedef function_traits<decltype(lambda)> traits; static_assert(std::is_same<long, traits::result_type>::value, "err"); static_assert(std::is_same<int, traits::arg<0>::type>::value, "err"); return 0; }
Contoh ini menggambarkan cara menggunakan function_traits untuk mengesahkan parameter yang dijangkakan dan jenis pengembalian lambda. Ambil perhatian bahawa pendekatan ini mungkin tidak berfungsi untuk lambda generik seperti [](auto x) {}.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Dapatkan Parameter dan Mengembalikan Jenis Ungkapan Lambda dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!