3

我期待着擴展描述here的功能,但對於成員函數,這種情況下的語法是什麼?C++推演成員函數參數

另外,模板定義中的(*)是否會引用函數指針,以便編譯器可以推導出模板參數?

將不勝感激!

感謝

template <class F> struct ArgType; 

template <class R, class T> 
struct ArgType<R(*)(T)> { 
    typedef T type; 
}; 

void f(int) {} 

#include <type_traits> 
#include <iostream> 

int main() { 

    // To prove 
    std::cout << std::is_same< ArgType<decltype(&f)>::type, int >::value << '\n'; 

    // To use 
    ArgType<decltype(&f)>::type a; 
} 
+0

模板定義中的'*'只是函數指針語法的一部分。 – phantom

+0

這是一個函數指針,你需要一個成員函數指針,它是一個'R(T :: *)(參數...)' – chris

+0

分解成員函數類型通常在一個叫做「成員函數類型)特徵「。 StackOverflow已經有幾個實現;提升也包含一個。 – dyp

回答

2

指針到成員看起來像Ret (Cls::*)(Args...) [cv-qualifiers] [ref-qualifiers]。所以,你可以擴展你的類來推斷第一類型正是如此:

template <class F> struct ArgType; 

template <typename Ret, typename Cls, typename T, typename... Args> 
struct ArgType<Ret (Cls::*)(T, Args...)> { 
    using type = T: 
}; 

請注意,你可以通過寫一個元函數,它爲您提供了n個參數此更通用的:

template <typename Ret, typename Cls, typename... Args> 
struct ArgType<Ret (Cls::*)(Args...)> { 

    template <size_t N> 
    struct get_arg { 
     using type = typename std::tuple_element<N, 
         std::tuple<Args...>>::type; 
    }; 
}; 

所以ArgType<F>::arg<0>::type會是你尋求的類型。

+0

加分類cv-qualifier/ref-qualifier/C可變參數變體;你需要24個部分專業化... –

+0

@ T.C。爲了理智而省略。 – Barry

+0

感謝您的回覆!非常有幫助的,總是找到成員函數語法的指針,有點繞口令+模板拋出,我的小腦子無法應付。 乾杯! – Maddius