其他分享
首页 > 其他分享> > 如何在C中创建一个包含不同类型的函数指针的容器?

如何在C中创建一个包含不同类型的函数指针的容器?

作者:互联网

我正在做一个线性遗传程序设计项目,其中程序是通过自然进化机制进行繁殖和进化的.他们的“ DNA”基本上是一个容器(我已经成功使用了数组和向量),其中包含指向一组可用函数的函数指针.
现在,对于简单的问题,例如数学问题,我可以使用一个类型定义的函数指针,该指针可以指向全部返回一个double且所有参数都取为double的函数.

不幸的是,这不是很实际.我需要有一个容器,该容器可以具有不同种类的函数指针,例如指向不带参数的函数的函数指针,或带一个参数的函数或返回某些东西的函数,等等(您得到了理念)…

有没有办法使用任何一种容器来做到这一点?
我是否可以使用包含多态类的容器来做到这一点,而多态类又具有各种功能指针?
我希望有人可以引导我寻求解决方案,因为重新设计到目前为止我所做的一切都会很痛苦.

解决方法:

虚拟机的典型想法是拥有一个单独的堆栈,该堆栈用于传递参数和返回值.

您的函数仍然可以全部为void fn(void)类型,但是您需要手动进行参数传递和返回.

您可以执行以下操作:

class ArgumentStack {
    public:
        void push(double ret_val) { m_stack.push_back(ret_val); }

        double pop() {
             double arg = m_stack.back();
             m_stack.pop_back();
             return arg;
        }

    private:
        std::vector<double> m_stack;
};
ArgumentStack stack;

…所以一个函数可能看起来像这样:

// Multiplies two doubles on top of the stack.
void multiply() {
    // Read arguments.
    double a1 = stack.pop();
    double a2 = stack.pop();

    // Multiply!
    double result = a1 * a2;

    // Return the result by putting it on the stack.
    stack.push(result);
}

可以通过以下方式使用:

// Calculate 4 * 2.
stack.push(4);
stack.push(2);
multiply();
printf("2 * 4 = %f\n", stack.pop());

你遵循吗?

标签:genetic-programming,c,containers,virtual-machine,function-pointers
来源: https://codeday.me/bug/20191013/1908784.html