我想存储一组不同类的成员函数。在这里重复一下:
要求:
- 类型类
- 包含函数的类实例
- AddressOf成员函数
- 成员函数参数
我可以存储什么:
- 包含函数的类实例
- AddressOf 成员函数。
- 成员函数参数
通常,您不需要存储任何类类型,因为您可以创建一个指向类类型的数组指针。我不能这样做的原因是因为我接受的类类型是未知的和不同的。该类将用于许多类类型未知的不同项目。
我需要将不同类型的类存储到数组/列表中,在这种情况下,我只是将类的地址存储到数组指针中。
我的问题: 当我要调用成员函数时,我需要将 Class 地址转换为 Class 类型,但我不知道要转换成什么类型。
示例代码(未测试 - 真正快速编写):
class A
{
public:
void test1(int i);
};
class B
{
public:
void test2(char c);
};
class Container
{
long* objects;
long* funcs;
int index;
public:
Container()
{
objects = new long[5];
funcs = new long[5];
index = 0;
}
template <class C, typename Types ...>
void Add(C *obj, void (C::*func)(Types ...))
{
objects[index++] = (long)obj;
funcs[index++] = (long)func;
}
typename <Types ...>
void Call(int inx, Types ... values)
{
void (*func)(Types ...) = (void (*)(Types ...))funcs[inx];
// This is where I've got trouble. I don't store the Class
// types, so I don't know what pointer Class type to cast
// the Class Instance address to.
(((*???)objects[inx])->*func)(values ...);
}
};
提前致谢。如果有任何漏洞或任何问题,请提前询问。
最佳答案
你能在成员函数的签名上稍微限制一下吗?如果是这样,您可以存储绑定(bind)函数,而不是分别存储指向对象和成员函数的指针。
template<typename... Args>
class Container {
public:
typedef std::function<void (Args...)> F;
template <class C>
void Add(C* obj, void (C::*func)(Args ...))
{
functions.push_back( [=](Args... args) {(obj->*func)(args...);} );
}
void call(size_t i, Args... args)
{
functions[i](args...);
}
private:
std::vector<F> functions;
};
关于C++::成员函数数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32627769/