Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah saya boleh mengakses jenis hujah daripada penuding fungsi dalam kelas templat variadic dalam C?

Bagaimanakah saya boleh mengakses jenis hujah daripada penuding fungsi dalam kelas templat variadic dalam C?

Linda Hamilton
Linda Hamiltonasal
2024-11-07 08:21:03649semak imbas

How can I access argument types from a function pointer within a variadic template class in C  ?

Mengakses Jenis Argumen dalam Kelas Templat Variadik untuk Penunjuk Fungsi

Dalam usaha untuk mencipta functor generik untuk fungsi dengan sebarang senarai argumen, pembangun berusaha untuk mengekstrak jenis argumen penunjuk fungsi dalam pembina kelas.

Pertimbangkan kelas functor berikut:

<code class="cpp">template<typename... ARGS>
class Foo {
private:
    std::function<void(ARGS...)> m_f;
public:
    Foo(std::function<void(ARGS...)> f) : m_f(f) {}
    void operator()(ARGS... args) const { m_f(args...); }
};</code>

Untuk mengakses jenis argumen dalam pembina, pembangun menggunakan teknik "mengupas" senarai hujah secara rekursif, seperti yang digariskan oleh Stroustrup dalam Soalan Lazim C 11 beliau. Walau bagaimanapun, jenis argumen tidak mudah diakses daripada penuding fungsi f.

Dengan menggunakan kelas function_traits, ia menjadi mungkin untuk menemui jenis argumen, jenis pulangan dan bilangan argumen yang dikaitkan dengan penuding fungsi.

<code class="cpp">template<typename T> 
struct function_traits;  

template<typename R, typename ...Args> 
struct function_traits<std::function<R(Args...)>> {
    static const size_t nargs = sizeof...(Args);

    typedef R result_type;

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

Memanfaatkan kelas function_traits ini, pembangun kini boleh mendapatkan semula jenis hujah dalam pembina kelas functor:

<code class="cpp">template<typename... ARGS>
class Foo {
private:
    std::function<void(ARGS...)> m_f;
    std::tuple<typename function_traits<decltype(m_f)>::arg<0>::type...> m_arg_types;
public:
    Foo(std::function<void(ARGS...)> f) : m_f(f), m_arg_types(std::make_tuple(typename function_traits<decltype(m_f)>::arg<0>::type()...)) {}
    void operator()(ARGS... args) const { m_f(args...); }
};</code>

Atas ialah kandungan terperinci Bagaimanakah saya boleh mengakses jenis hujah daripada penuding fungsi dalam kelas templat variadic 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