功能指向非静态成员函数的指针?

时间:2012-03-14 23:13:20

标签: c++ winapi function-pointers static-members

是否可以使用函数指针指向非静态成员函数?我想指出一个使用非静态对象和类中的变量的成员函数...静态成员函数不能这样做...

我有一个成员函数,指向四个静态成员函数之一。问题是四个成员函数中每个成员函数使用的数据都是非静态的,因此静态成员函数不会访问它们......

我可以指向非静态成员函数吗?

此外,类实例是一个指针......这是我的代码:

class CRoutine{
int m_index;
    ...
        BOOL (*CallRoutine(char opcode))(DWORD, float, float, float);
        static BOOL Update(DWORD, float, float, float);
        static BOOL Transition(DWORD, float, float, float);
        static BOOL Revert(DWORD, float, float, float);
        static BOOL Sequence(DWORD, float, float, float);
    ...
    };
    BOOL (*CRoutine::CallRoutine(char opcode))(DWORD, float, float, float)
    {   
        switch ( opcode )
        {
        case 0:
            return &CRoutine::Update;
        case 1:
            return &CRoutine::Transition;
        case 2:
            return &CRoutine::Revert;
        case 3:
            return &CRoutine::Sequence;
        default:
            return &CRoutine::Update;
        }
    }
    BOOL CRoutine::Update(DWORD AnimSetIndex, float time, float tTime, float shift)
    {
        MessageBox(NULL, L"Updating", L"Routine #1", MB_OK);
         CRoutine::m_index++; // Error thrown here...       
return true;
    }
    BOOL CRoutine::Transition(DWORD AnimSetIndex, float time, float tTime, float shift)
    {
        MessageBox(NULL, L"Transitioning", L"Routine #2", MB_OK);
        return true;
    }
    BOOL CRoutine::Revert(DWORD AnimSetIndex, float time, float tTime, float shift)
    {
        MessageBox(NULL, L"Reverting", L"Routine #3", MB_OK);
        return true;
    }
    BOOL CRoutine::Sequence(DWORD AnimSetIndex, float time, float tTime, float shift)
    {
        MessageBox(NULL, L"Sequencing", L"Routine #4", MB_OK);
        return true;
    }

上面抛出的错误是: 错误C2597:非法引用非静态成员'CRoutine :: m_index'

1 个答案:

答案 0 :(得分:1)

是,只要您可以修改其存储类型。

使用std :: function摘要,您可以绑定到满足特定签名的任何内容(即取x返回y)。无论是算子,lambda,绑定成员函数还是自由函数。

struct bar{
     void foo(){
          std::cout << "HI" << std::endl;
    } 
};

int main(){

    bar b;
    //using std::function instead of a func*
    std::function<void()> func(
                 std::bind(&bar::foo, &b));

    func();
}

注意使用std :: function需要C ++ 11,boost也有一个非常类似的版本,可以与C ++ 98一起使用