Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Kita Boleh Menentukan Parameter dan Jenis Pengembalian Fungsi C Lambda?

Bagaimanakah Kita Boleh Menentukan Parameter dan Jenis Pengembalian Fungsi C Lambda?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-25 14:50:10588semak imbas

How Can We Determine the Parameter and Return Types of a C   Lambda Function?

Menemui Parameter dan Jenis Pengembalian Lambda

Soalan

Bolehkah kita menentukan parameter dan jenis pengembalian fungsi lambda dalam C ? Jika ya, bagaimana?

Siasatan ini didorong oleh keperluan untuk mengetahui jenis dalam templat fungsi yang mengambil lambda sebagai hujah.

Jawapan

Penyelesaian terletak dalam menggunakan function_traits, seperti yang ditunjukkan oleh kod ini:

template <typename T>
struct function_traits : public function_traits<decltype(&T::operator())> {};

template <typename ClassType, typename ReturnType, typename... Args>
struct function_traits<ReturnType(ClassType::*)(Args...) const>
{
    enum { arity = sizeof...(Args) };
    typedef ReturnType result_type;

    template <size_t i>
    struct arg
    {
        typedef typename std::tuple_element<i, std::tuple<Args...>>::type type;
    };
};

// Example usage
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;
}

Pelaksanaan ini memanfaatkan decltype operator() lambda untuk memperoleh jenis parameternya.

Had Terkenal

Adalah penting untuk ambil perhatian bahawa teknik ini tidak berkesan dengan lambda generik seperti [](auto x) {}.

Atas ialah kandungan terperinci Bagaimanakah Kita Boleh Menentukan Parameter dan Jenis Pengembalian Fungsi C Lambda?. 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