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

Linda Hamilton
Lepaskan: 2024-11-07 08:21:03
asal
574 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!