gpt4 book ai didi

c++ - 引用水平第 2 部分

转载 作者:行者123 更新时间:2023-11-28 08:19:53 26 4
gpt4 key购买 nike

Expanding on this question ,看来我没有提供足够的细节。

我有一个名为 CallbackObject 的对象,它旨在包含一个对象实例、要调用的函数的信息以及调用时要传递的参数。

template <typename objectType,          typename memberFunctionPtrType,          typename memberFcnArg1Type>struct CallbackObject1{  objectType obj ;  memberFunctionPtrType fcnPtr ;  memberFcnArg1Type arg1 ;  CallbackObject1(objectType iObj,                  memberFunctionPtrType iFcnPtr,                  memberFcnArg1Type iArg1 )  {    obj = iObj ;    fcnPtr = iFcnPtr ;    arg1 = iArg1 ;  }  void exec()  {    (obj.*fcnPtr)( arg1 ) ;  }} ;

使用示例:

struct Point{  float x,y ;  void print( int numTimes )  {    for( int i = 0 ; i < numTimes ; i++ )      printf( "%f %f\n", x, y ) ;  }} ;typedef void (Point::* PointPrintFcnType)( int ) ;int main(){  Point p ;  p.x=p.y=1;  CallbackObject1<Point, PointPrintFcnType, int> ocall( p, &Point::print, 5 );  ocall.exec() ;}

我遇到的唯一问题是,如果 objectType 是指针类型,那么 (obj.*fcnPtr) 会失败,因为它应该真正读取 ( (*obj).*fcnPtr)(obj->*fcnPtr) 如果 obj 是指针。

现在我有了一个解决方案,我定义了另一个 CallbackObject 类,如下所示:

template <typename pObjectType,          typename memberFunctionPtrType,          typename memberFcnArg1Type>struct CallbackPObject1{  pObjectType obj ;  memberFunctionPtrType fcnPtr ;  memberFcnArg1Type arg1 ;  CallbackPObject1(pObjectType iObj,                  memberFunctionPtrType iFcnPtr,                  memberFcnArg1Type iArg1 )  {    obj = iObj ;    fcnPtr = iFcnPtr ;    arg1 = iArg1 ;  }  void exec()  {    (obj->*fcnPtr)( arg1 ) ;  }} ;

但这充其量是笨拙的,最坏的情况是难以使用,如果其他人正在使用此代码,如果所使用的对象类型实际上是一个指针,他们将不得不创建一种不同类型的回调对象。

有什么办法解决这个问题吗?

最佳答案

这是一个示例辅助函数,假设返回 void,一个参数,并且不需要处理多于一级的间接寻址:

template <typename T, typename F, typename A>
inline void invoke(T& obj, F func, const A& arg)
{
(obj.*func)(arg);
}

template <typename T, typename F, typename A>
inline void invoke(T* obj, F func, const A& arg)
{
(obj->*func)(arg);
}

如果你需要处理不止一层的间接寻址,你可以用这个替换第二个函数:

template <typename T, typename F, typename A>
inline void invoke(T* obj, F func, const A& arg)
{
invoke(*obj, func, arg);
}

这将递归地剥离间接级别,直到您最终得到可以调用成员函数的东西。

然后您可以像这样编写您的 exec() 函数:

void exec()
{
invoke(obj, fcnPtr, arg1);
}

关于c++ - 引用水平第 2 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6238547/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com