有没有办法从任何类(没有模板)调用方法指针

问题描述 投票:0回答:1

有没有办法使用指针从任何类调用任何方法?

类似这样的事情:

#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;
}

目前我正在使用模板,但这非常烦人,因为我仅限于一个类,所以我必须为每个类创建一个向量。我希望能够有一个单一的向量,我可以在其中推送任何类的任何方法......

c++ pointers
1个回答
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
的实例,但你的示例也是如此。生命周期管理留给读者作为练习。

© www.soinside.com 2019 - 2024. All rights reserved.