有没有办法使用指针从任何类调用任何方法?
类似这样的事情:
#include <vector>
class AnyClass {
public:
virtual void call(void* instance, void (*callback)(float value), float value) = 0;
};
class MyClass1 : public AnyClass {
public:
// void call(void* instance, void ((void *)::*callback)(float value), float value)
void call(void* instance, void (*callback)(float value), float value)
{
MyClass1* obj = (MyClass1*)instance;
(obj->*(callback))(value);
}
void hello(float value)
{
printf("hello %f\n", value);
}
};
class MyClass2 : public AnyClass {
public:
void call(void* instance, void (*callback)(float value), float value)
{
MyClass2* obj = (MyClass2*)instance;
(obj->*(callback))(value);
}
void world(float value)
{
printf("world %f\n", value);
}
};
int main()
{
struct Caller {
AnyClass* instance;
void (*callback)(float value);
float value;
};
Vetcor<Caller> vetcor = { { new MyClass1, &MyClass1::hello, 0.123 }, { new MyClass2, &MyClass2::world, 0.456 } };
for (int i = 0; i < vetcor.size(); i++) {
vetcor[i].call(vetcor[i].instance, vetcor[i].callback, vetcor[i].value);
}
return 0;
}
目前我正在使用模板,但这非常烦人,因为我仅限于一个类,所以我必须为每个类创建一个向量。我希望能够有一个单一的向量,我可以在其中推送任何类的任何方法......
尚不完全清楚您想要实现的目标,但这也许会指出一个有用的方向。
using Callback_t = std::function<void()>;
template <typename T>
Callback_t MakeCallback(void (T::*f)(float), float val) {
T* p = new T;
return [=]() { (p->*f)(val); }
}
std::vector<Callback_t> vetcor = {
MakeCallback(&MyClass1::hello, 0.123),
MakeCallback(&MyClass2::world, 0.456)};
for (int i = 0; i < vetcor.size(); i++) {
vetcor[i]();
}
这会泄漏
MyClass1
和 MyClass2
的实例,但你的示例也是如此。生命周期管理留给读者作为练习。