C++::成员函数数组

标签 c++ function class templates member

我想存储一组不同类的成员函数。在这里重复一下:

要求:

  • 类型
  • 包含函数的类实例
  • 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/

相关文章:

java - 如何导入具有使用 "<"和 ">"符号的格式的特定类型的类?

c++ - 尝试使用静态方法/成员

C++ 从函数定义在 main 中的类中的函数指针 vector 调用函数

jquery - 无法将 id 传递给 click 函数

javascript - 消除由于不可预见的错误而导致的一组功能的不完整执行(JavaScript)

jQuery :last or :lastChild and how?

java - 我应该如何在 Java 中初始化一个复杂的实例变量?

c++ - 在不同浮点精度之间切换时使用我自己的 std::mersenne_twister_engine 模板参数

c++ - 对 static const int 的 undefined reference

c++ - Win32 - 为什么没有任何东西被绘制到屏幕上?