ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-10-13 15:04:52  阅读:345  来源: 互联网

标签:genetic-programming c containers virtual-machine function-pointers


我正在做一个线性遗传程序设计项目,其中程序是通过自然进化机制进行繁殖和进化的.他们的“ 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有