2012-12-04 32 views
0

我想知道是否可以,传入一个类的实例的指针,获取它的成员函数并将其存储在列表中。我会怎么做?我将如何存储一个类的成员函数?

+1

你是指在反射或只是提供一个函数在类中返回一个列表? – chris

+2

您无法在运行时找到成员函数。如果你确切知道你想在编译时存储哪些函数,那是不同的 –

+3

C++不是C#。没有与类的实例关联的元数据。因此,你想要的是不可能的。 – nakiya

回答

0

简便方法是使用一些模板魔术和继承:

template<class R> 
class Base { 
public: 
    virtual R Execute() const=0; 
}; 

template<class R, class P1, class P2> 
class Derived : public Base<R> { 
public: 
    void set_params(P1 p1, P2 p2) { m_p1 = p1; m_p2 = p2; } 
    R Execute() const { return Map(m_p1,m_p2); } 
protected: 
    virtual R Map(P1, P2) const=0; 
private: 
    P1 m_p1; 
    P2 m_p2; 
}; 

template<class T, class R, class P1, class P2> 
class MemFunc : public Derived<R,P1,P2> { 
public: 
    MemFunc(T *object, R (T::*fptr)(P1, P2)) : object(object), fptr(fptr) { } 
    virtual R Map(P1 p1, P2 p2) const { return (object->*fptr)(p1,p2); } 
private: 
    T *object; 
    R (T::*fptr)(P1,P2); 
}; 

然后main()函数看起来像:

int main() { 
    std::vector<Base<int>*> vec; 
    Object o; 
    Derived<int, float,float> *ptr = new MemFunc(&o, &Object::MyFunc); 
    ptr->set_params(10.0,20.0); 
    vec.push_back(ptr); 
    int i = vec[0].Execute(); 
} 

当你想要一个类的所有成员函数存储,你需要几个向量:

std::vector<Base<int>*> vec_int; 
std::vector<Base<float>*> vec_float; 
std::vector<Base<MyObject>*> vec_myobject; 
0

很长的答案,这里是一个教程,在C++函数指针tutorial page

简而言之,这里是一个将函数指针存储在数组中的示例。注意未编译。

typedef void(*pFunc)(void); //pFunc is an alias for the function pointer type 
void foo1(){}; 
void foo2(){} 
int main(){ 
    pFunc funcs[2] = {&foo1, &foo2}; //hold an array of functions 
} 

现在的成员函数有一点不同的语法:

struct Foo{ 
    void foo1(){} 
    void foo2(){} 
} 

typedef (*Foo::pFunc)(); //pFunc is an alias to member function pointer 

int main(){ 
    pFunc funcs[2] = {&Foo::foo1, &Foo::foo2}; 
} 

最好的办法是检查出我放在这里的链接。它深入研究了sytax等等。如果你正在使用新的C++ 11,那么你可以使用std :: function,或者如果你有提升,你可以使用boost :: function。

相关问题