首頁  >  文章  >  後端開發  >  如何檢索可變參數模板類別中函數指標的參數類型?

如何檢索可變參數模板類別中函數指標的參數類型?

Linda Hamilton
Linda Hamilton原創
2024-10-31 02:49:01468瀏覽

How to Retrieve Argument Types of Function Pointers in Variadic Template Classes?

在可變參數模板類中檢索函數指針的參數類型

泛型函子是有用的類,它提供了一種便捷的方法來處理具有不同參數列表的函數。然而,存取這些類別中函數指標的參數類型可能是一個挑戰。

解決方案

考慮以下函子類:

<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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn