C ++中成员函数的第一个参数的类型11
我已经写了一个元函数来检索成员函数的第一个参数的类型,该函数当然会接收一个或多个参数。 我写的代码如下:
template <typename...> struct parameter;
template < typename O, typename A, typename R, typename... Args>
struct parameter <R (O::*)(A, Args...) > {
using first_param = A;
};
我使用这个元函数如下:
using mem_fn = void(mem_type::*)(std::vector<int>);
using f_pm = parameter<mem_fn>::first_param;
它编译和工作。 但是当我有一堂课时:
struct mem_type{
void update(std::vector<int>) {
}
};
并使用我的元函数如下:
using mem_fn = decltype(mem_type::update);
using f_pm = parameter<mem_fn>::first_param;
该代码不会编译,Visual Studio 2013会提供:错误C2027:使用未定义的类型parameter<mem_fn>
。
有谁知道这个错误的原因?
首先,命名非静态成员函数(本例中为mem_type::update
)的id表达式不能用作未评估的操作数(例如decltype
的操作数)。 §5.1.1[expr.prim.general] / p13(脚注省略):
只能使用表示非静态数据成员或类的非静态成员函数的id表达式:
§7.1.6.2[dcl.type.simple] / p4:
decltype
说明符的操作数是未评估的操作数(第5章)。
即使update
是一个常规函数, decltype
也会产生一个函数类型而不是函数指针类型,而且你的特化decltype
与一个指向成员函数的类型相匹配。
您需要使用&
- 即decltype(&mem_type::update)
创建指向成员函数的指针。
上一篇: Type of the first parameter of a member function in C++11
下一篇: How can I get n largest lists from a list of lists in python