以下是问题所在:
1)我有一个这样的类:
class some_class
{
public:
some_type some_value;
int some_function(double *a, double *b, int c, int d, void *e);
};
2)在some_function
中,我使用来自some_class
对象的some_values
来获得结果。
3)所以,我有一个具体的对象,我想得到一个指向这个对象some_function
的指针。
有可能吗?我不能使用some_fcn_ptr
,因为这个函数的结果取决于对象的具体some_value
。
如何获取指向对象的some_function
的指针?谢谢。
typedef int (Some_class::*some_fcn_ptr)(double*, double*, int, int, void*);
发布于 2012-01-15 06:19:39
不,您不能获得指向C++类方法的指针(除非该方法被声明为静态)。原因是一个类方法总是有一个指针this
,一个指向类实例的指针。但是如果您通过指针调用该方法,则该指针无法封装this
指针,然后将不会附加任何实例,因此此行为是不合法的。
发布于 2012-01-15 06:48:34
您可以编写某种类型的包装器,它既可以使用函数也可以使用方法作为参数。
我使用了以下类来启动函数(它在我的一个SDL程序中使用):
class CallbackFunction {
public:
// Constructor, copy constructor and destructor
virtual int execute( SDL_keysym* keysym) const;
virtual int operator()( SDL_keysym* keysym) const;
protected:
int( *callback)( SDL_keysym*));
}
int CallbackFunction::execute( SDL_keysym* keysym) const{
return callback(keysym);
}
int CallbackFunction::operator()( SDL_keysym* keysym) const{
return callback( keysym);
}
还有这个“方法”的扩展:
template<class T>
class CallbackMethod : public CallbackFunction {
public:
// Constructor, copy constructor and destructor
CallbackMethod( T *object, int(T::*callback)( SDL_keysym* keysym));
int execute( SDL_keysym* keysym) const;
int operator()(SDL_keysym* keysym) const;
protected:
T *object;
int(T::*method)( SDL_keysym* keysym);
};
// Object initialization (constructor)
template<class T>
CallbackMethod<T>::CallbackMethod( T *object, int(T::*callback)( SDL_keysym* keysym)):
CallbackFunction( NULL),object(object),method(callback){
}
// Responsible for executing
template<class T>
int CallbackMethod<T>::execute( SDL_keysym* keysym) const {
return (object->*method)(keysym);
}
template<class T>
int CallbackMethod<T>::operator()( keysym) const {
return (object->*method)( keysym);
}
然后将其用作:
CallbackFunction *callback;
callback = new CallbackFunction( myFunction);
callback = new CallbackMethod<A>( instanceOfA, instanceOfA::myMethod);
callback = new CallbackMethod<B>( instanceOfB, instanceOfB::myMethod);
...
callback( keysym);
我发现宏是这样的:
CALLBACK(object,method) new CallbackMethod<typeof(*object)>( object, &method)
非常有用
发布于 2012-01-15 06:25:31
虽然不完全符合您的要求,但如果您可以使用C++11,以下内容可能会满足您的需求(未经测试):
std::function<int(double*, double*, int, int, void*)>
some_function_of(Some_class& obj)
{
return [&](double* a, double* b, int c, int d, void* e){
return obj.some_func(a, b, c, d, e); };
}
https://stackoverflow.com/questions/8865766
复制相似问题