如何定义和设置指向模板类方法的功能指针
How to define and set a funtion pointer to a template class method
我需要将一个函数指针变量设置为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( 不同
如何定义正确的类型?
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)
(尽管根据平台的调用约定或是否涉及继承,实现实际上可能有很大不同(。 它需要一个额外的隐藏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)
说"使用参数i
调用this
指向的对象上的proc
指向的成员函数"。
#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 Worldn");
X<int> *p = new X<int>(3);
printf("%dn", (p->*(p->curproc))(7));
}
通常的模板类在头文件中定义。 您可以在此处找到更多信息:
- 为什么我不能将模板类的定义与其声明分开,并将其放在.cpp文件中?
- 如何避免模板函数出现链接器错误?
- C++关键字导出如何帮助模板链接器错误?
更改
return p->curproc(7);
自
return (p->*(p->curproc))(7);
*(p->currproc( 是函数指针,需要在 p 对象指针上调用
详情
C++函数指针(类成员(到非静态成员函数
相关文章:
- 如何访问由共享指针保存的类方法?
- 我无法使用C++指针指向类方法返回的 std::vector
- 如何在成为指向基类的指针后保留对子类方法的使用?
- 将一个类的方法指针存储到另一个类中
- 如果类"A"具有指向另一个类的指针,则"B" A 可以访问 B 类公共方法
- 类方法返回指向具有模板的类成员的指针
- 指向类方法调用的指针
- 在类方法中使用 "this" 指针是否是一种好的做法?
- C++ - 类方法函数指针unordered_map的初始化器列表
- 如何定义和设置指向模板类方法的功能指针
- 如何在没有虚拟方法的类dynamic_cast指针?
- 将指针传递到类方法
- C++ - 基类函数指针调用的替代方法
- 将const指针(EVP_MD)保存到变量中,以将其重新使用为类方法(HMAC)
- 如何调用返回类方法指针的类方法
- C++;类方法指针;λ;将 lambda 作为成员函数指针传递;
- 尝试获取类方法指针时出现E_NOINTERFACE
- 指向方法父参数c++的子类方法指针
- 给出一个闭包作为"类方法指针"?
- 静态类方法指针数组的正确语法