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;
};
};