泛型函子是有用的類,它提供了一種便捷的方法來處理具有不同參數列表的函數。然而,存取這些類別中函數指標的參數類型可能是一個挑戰。
考慮以下函子類:
<code class="cpp">template <typename... ARGS> class Foo { 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>
雖然您可以輕鬆訪問operator()方法中的args...使用了遞歸“剝離”函數,在建構函數中取得參數類型更加複雜。
為了解決這個問題,可以實作一個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>
透過此類,您可以確定函數指標的參數類型、傳回類型和參數數量。
以下程式碼示範了功能:
<code class="cpp">struct R {}; struct A {}; struct B {}; void main() { typedef std::function<R(A, B)> fun; cout << std::is_same<R, function_traits<fun>::result_type>::value << endl; cout << std::is_same<A, function_traits<fun>::arg<0>::type>::value << endl; cout << std::is_same<B, function_traits<fun>::arg<1>::type>::value << endl; }</code>
以上是如何檢索可變參數模板類別中函數指標的參數類型?的詳細內容。更多資訊請關注PHP中文網其他相關文章!