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!