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

如何從 C 中的可變參數模板類別中的函數指標存取參數類型?

Linda Hamilton
Linda Hamilton原創
2024-11-07 08:21:03575瀏覽

How can I access argument types from a function pointer within a variadic template class in C  ?

存取函數指標的可變參數範本類別中的參數類型

為了為具有任何參數清單的函數建立通用函子,開發人員試圖在類別建構函數中提取函數指標的參數類型。

考慮以下函子類別:

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

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