C++ C++;推导成员函数参数

C++ C++;推导成员函数参数,c++,templates,function-pointers,member-function-pointers,C++,Templates,Function Pointers,Member Function Pointers,我希望扩展所描述的功能,但是对于成员函数,本例中的语法是什么 另外,模板定义中的(*)是指取消引用函数指针,以便编译器可以推断模板参数 如果您有任何意见,我们将不胜感激 谢谢 template <class F> struct ArgType; template <class R, class T> struct ArgType<R(*)(T)> { typedef T type; }; void f(int) {} #include <t

我希望扩展所描述的功能,但是对于成员函数,本例中的语法是什么

另外,模板定义中的(*)是指取消引用函数指针,以便编译器可以推断模板参数

如果您有任何意见,我们将不胜感激

谢谢

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;
}
模板结构ArgType;
模板
结构ArgType{
T型;
}; 
空f(int){}
#包括
#包括
int main(){
//证明

std::cout::value指向成员的指针看起来像
Ret(Cls::*)(Args…[cv限定符][ref限定符]
。因此,您可以扩展类来推断第一种类型:

template <class F> struct ArgType;

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

因此,
ArgType::arg::type
将是您寻求的类型。

模板定义中的
*
只是函数指针语法的一部分。这是一个函数指针,您需要一个成员函数指针,它是一个
R(T::*)(Args…
分解成员函数类型通常在一个名为“成员功能(类型)特征".StackOverflow上已经有几个实现;boost也包含一个。感谢大家的输入!加上各种各样的cv限定符/ref限定符/C varargs变体;您需要24个部分专门化…@T.C.省略以保持健全。感谢回复!非常有帮助,始终会发现指向成员函数语法的指针有点尖刻ster+加上扔在那里的模板,我的小脑袋无法应付。干杯!有人真的尝试过吗?它对我不起作用(“需要一个类型,得到了“&Bar::doSomething”)@JeffTrull好的,你需要传递一个类型…
decltype(&Bar::doSomething)
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;
    };
};