我需要设置一个函数指针变量,它是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)is not the same as
int (*)(int)
如何定义正确的类型?
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;
};
时髦的语法(this->*proc)(i)
说“在proc
用this
参数指向的对象上调用i
指向的成员函数”。
#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));
}
更改
return p->curproc(7);
至
return (p->*(p->curproc))(7);
*(p-> currproc)是函数指针,需要在p对象指针上调用
详情
C++ function pointer (class member) to non-static member function