Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Dapatkan Parameter dan Mengembalikan Jenis Ungkapan Lambda dalam C?

Bagaimanakah Saya Boleh Dapatkan Parameter dan Mengembalikan Jenis Ungkapan Lambda dalam C?

Patricia Arquette
Patricia Arquetteasal
2024-12-22 17:47:10912semak imbas

How Can I Retrieve the Parameter and Return Types of a Lambda Expression in C  ?

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(&amp;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!

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