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表达式:

  • 作为类成员访问(5.2.5)的一部分,其中对象表达式指的是成员的类或从该类派生的类,或者
  • 形成一个指向成员(5.3.1)的指针,或者
  • 如果该id表达式表示非静态数据成员并且它出现在未评估的操作数中。
  • §7.1.6.2[dcl.type.simple] / p4:

    decltype说明符的操作数是未评估的操作数(第5章)。

    即使update是一个常规函数, decltype也会产生一个函数类型而不是函数指针类型,而且你的特化decltype与一个指向成员函数的类型相匹配。

    您需要使用& - 即decltype(&mem_type::update)创建指向成员函数的指针。

    链接地址: http://www.djcxy.com/p/82781.html

    上一篇: 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