存取函數指標的可變參數範本類別中的參數類型
為了為具有任何參數清單的函數建立通用函子,開發人員試圖在類別建構函數中提取函數指標的參數類型。
考慮以下函子類別:
<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>
要存取建構函式中的參數類型,開發人員使用一種遞歸地「剝離」參數清單的技術,如Stroustrup 在他的C 11 FAQ 中所概述的。然而,參數類型不容易從函數指標 f 存取。
透過使用 function_traits 類,可以發現與函數指標關聯的參數類型、傳回類型和參數數量。
<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>
利用此 function_traits 類,開發人員現在可以檢索函子類建構函式中的參數型別:
<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>
以上是如何從 C 中的可變參數模板類別中的函數指標存取參數類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!