获取指向对象成员函数的指针

Ale*_*pus 29 c++ function-pointers member

这是问题所在:

1)我有一个这样的课:

class some_class
{
public:
    some_type some_value;
    int some_function(double *a, double *b, int c, int d, void *e);
};
Run Code Online (Sandbox Code Playgroud)

2)在里面some_function,我使用some_values从some_class对象得到一个结果.

3)所以,我有一个具体的对象,我想得到一个指向这个对象的指针some_function.

可能吗?我无法使用,some_fcn_ptr因为此函数的结果取决于some_value对象的具体情况.

如何获得指向some_function对象的指针?谢谢.

typedef  int (Some_class::*some_fcn_ptr)(double*, double*, int, int, void*);
Run Code Online (Sandbox Code Playgroud)

And*_*hko 32

你不能,至少它不会只是指向函数的指针.

成员函数对于此类的所有实例都是通用的.所有成员函数都有隐式(第一个)参数 - this.要为特定实例调用成员函数,您需要指向此成员函数和此实例的指针.

class Some_class
{
public:
    void some_function() {}
};

int main()
{
    typedef void (Some_class::*Some_fnc_ptr)();
    Some_fnc_ptr fnc_ptr = &Some_class::some_function;

    Some_class sc;

    (sc.*fnc_ptr)();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

更多信息请参阅C++ FAQ

使用Boost这看起来像(C++ 11提供类似的功能):

#include <boost/bind.hpp>
#include <boost/function.hpp>

boost::function<void(Some_class*)> fnc_ptr = boost::bind(&Some_class::some_function, _1);
Some_class sc;
fnc_ptr(&sc);
Run Code Online (Sandbox Code Playgroud)

C++ 11的labdas:

#include <functional>

Some_class sc;
auto f = [&sc]() { sc.some_function(); };
f();
// or
auto f1 = [](Some_class& sc) { sc.some_function(); };
f1(sc);
Run Code Online (Sandbox Code Playgroud)

  • Boost*和*C++ 11. (3认同)

Vyk*_*tor 11

您可以编写某种Wrapper,它能够同时使用函数或方法作为参数.

我使用以下类来启动函数(它在我的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);
}
Run Code Online (Sandbox Code Playgroud)

这个"方法"的扩展:

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);
}
Run Code Online (Sandbox Code Playgroud)

然后将其用作:

CallbackFunction *callback;
callback = new CallbackFunction( myFunction);
callback = new CallbackMethod<A>( instanceOfA, instanceOfA::myMethod);
callback = new CallbackMethod<B>( instanceOfB, instanceOfB::myMethod);
...
callback( keysym);
Run Code Online (Sandbox Code Playgroud)

我发现宏是这样的:

CALLBACK(object,method) new CallbackMethod<typeof(*object)>( object, &method)
Run Code Online (Sandbox Code Playgroud)

真有用


Dov*_*eld 10

不,你不能得到一个指向C++类方法的指针(除非该方法被声明为static).原因是类方法总是有指针this,指向类实例的指针.但是你是通过指针调用方法,指针无法封装this指针,然后就没有附加实例,因此这种行为是不合法的.


cel*_*chk 5

虽然不完全符合您的要求,但如果您可以使用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); };
}
Run Code Online (Sandbox Code Playgroud)