如何定义和设置指向模板类方法的功能指针

时间:2018-06-13 12:42:41

标签: c++ templates member-function-pointers

我需要设置一个函数指针变量,它是X方法的模板类X的方法。

这是一个简单的例子。

X.h

template<typename T>
class X {
public:
    typedef T (*valproc)(T v);

    X(T v);

    T add(T v);
    T val;
    valproc curproc;
};

X.cpp

#include  "X.h"

template<typename T>
X<T>::X(T v) : val(v) {
    curproc = &X<T>::add;
}

template<typename T>
T X<T>::add(T v) {
    return v+val;
}

int main (int iArgC, char *apArgV[]) {
    X<int> *p = new X<int>(3);

    return  p->curproc(7);
}

当我编译它时,我收到一个错误:

$ g++ -c -g -Wall X.cpp
X.cpp: In instantiation of 'X<T>::X(T) [with T = int]':
X.cpp:15:29:   required from here
X.cpp:5:13: error: cannot convert 'int (X<int>::*)(int)' to 'X<int>::valproc {aka int (*)(int)}' in assignment
     curproc = &X<T>::add;

显然

int (X< int >::* )(int)
int (*)(int)

不同

如何定义正确的类型?

4 个答案:

答案 0 :(得分:2)

X<int>::add是一个非静态成员函数。这意味着&X<int>::add具有类型int(X<int>::*)(int):指向X<int>的非静态成员函数的指针,该函数采用单个int参数并返回int。这样的指针无法转换为int(*)(int)

int(X<int>::*)(int)在概念上与int(*)(X<int>*, int)更相似,而不是int(*)(int)(尽管实施实际上可能会有很大不同,具体取决于平台的调用约定或inheritance is involved) 。它需要一个额外的隐藏X<int>*参数:this指针。

最简单的方法是使用包装器方法:

template<typename T>
class X {
public:
    using valproc = T(X::*)(T v);

    X(T v)
        : val{v},
          proc{&X::add}
    {}

    T add(T v) { return v + val; }
    T curproc(T v) { return (this->*proc)(v); }

    T val;
    valproc proc;
};

Live Demo

时髦的语法(this->*proc)(i)说“proc使用参数this”调用i指向的成员函数。

答案 1 :(得分:1)

#include <stdio.h>

template<typename T>
class X {
public:
    X(T v);
    T add(T v);
    T val;
    int (X::*curproc)(T v);
};

template<typename T>
X<T>::X(T v) : val(v) {
    curproc = &X<T>::add;
}

template<typename T>
T X<T>::add(T v) {
    return v+val;
}

int main()
{
    printf("Hello World\n");
    X<int> *p = new X<int>(3);

    printf("%d\n",  (p->*(p->curproc))(7));
}

答案 2 :(得分:0)

答案 3 :(得分:0)

更改

return  p->curproc(7);

return (p->*(p->curproc))(7);

*(p-> currproc)是函数指针,需要在p对象指针上调用

详情

C++ function pointer (class member) to non-static member function