当前位置: 首页 > wzjs >正文

做公司网站建设价格低网站 动态内容加速

做公司网站建设价格低,网站 动态内容加速,他达拉非副作用,马连洼网站建设初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 系列入口: 编程实…

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


系列入口:

编程实战:类C语法的编译型脚本解释器(系列)-CSDN博客

        本文讲解插件(自定义函数)的接口。

        下文中的“插件”和“自定义函数”是两个概念:

  • “插件” 提供自定义函数功能的类,具有特殊的接口,一个插件实现一个自定义函数
  • “自定义函数” 脚本里的函数调用,形如“fun(a,b,c)”,脚本解释器负责将脚本里的函数调用与插件对应

目录

一、插件接口

二、插件管理器


一、插件接口

	//插件struct CPlugin{string plugin_name;Variable::types plugin_return_type;CPlugin() :plugin_name(""), plugin_return_type(Variable::NULLVARIABLE) {}CPlugin(char const* _name, Variable::types _type) :plugin_name(_name), plugin_return_type(_type) {}virtual string& help(string& ret){ret = plugin_name + " : 返回值 " + Variable::TypeStr(plugin_return_type) + "\r\n";return ret;}virtual bool CheckPlugin(vector<Variable >& params, void*& pc, string& msg) = 0;virtual bool ExecFunction(vector<Variable >& params, void* const& pc, Variable& ret, string& msg, void* pe) = 0;};

        这是个关键的接口,只有两个成员变量:

类型名称说明
stringplugin_name自定义函数名称,也就是函数名
Variable::typesplugin_return_type自定义函数的返回值类型,返回值放在一个Variable中,必须明确指定返回类型,编译时会检查返回值类型是否正确

        两个构造函数无关紧要,只是提供了设置自定义函数名称和返回值类型而已。

        三个虚函数很重要:

  1. help() 返回自定义函数说明,已经提供了一个示例实现,这种参数传递方式是用来避免不必要的对象创建的。
  2. CheckPlugin() 编译时检查,如果返回false则编译不通过。后面详细介绍。
  3. ExecFunction() 执行,执行脚本时通过此接口获得返回值。 后面详细介绍。

        CheckPlugin()和ExecFunction()有很多共同的参数,一起介绍:

类型名称说明
vector<Variable>params函数的参数列表,也就是fun(a,b,c)的“a,b,c”,编译时提供的值是无意义的,但可以检查类型是否符合预期
void * &pc

编译时用户提供的指针的引用,用户可以在编译时修改,意即:用户可以在CheckPlugin里面申请内存,保存在pc变量里供执行时使用

此变量在执行时是只读的,但是指向的内容仍然是可以修改的(我感觉在运行时不断修改这个指针是难以理解的)(大BUG,这个值其实根本没设置,编译和运行都没有设置,没有这个参数

Variable &ret存放函数的返回值
string &msg如果执行出错,可以在这里放返回值
void *pe运行时由用户提供的指针

         CheckPlugin()和ExecFunction()本身的返回值为bool,表达插件本身执行成功或失败,具体区别借助实例来理解:

	struct CMax : public CPlugin{CMax() :CPlugin("max", Variable::DOUBLE) {}virtual string& help(string& ret){ret = CPlugin::help(ret);ret += "取最大值,1-N个参数,参数必须是数值\r\n";return ret;}virtual bool CheckPlugin(vector<Variable >& params, void*& pc, string& msg){msg = "";if (params.size() < 1)msg += "参数不足\r\n";for (size_t i = 0; i < params.size(); ++i){if (!params[i].isNumber())msg += "参数必须是数值\r\n";}return 0 == msg.size();}virtual bool ExecFunction(vector<Variable >& params, void* const& pc, Variable& ret, string& msg, void* pe){size_t _max = 0;for (size_t i = 1; i < params.size(); ++i){if (params[i].GetDouble() > params[_max].GetDouble())_max = i;}ret = params[_max];return true;}};

        这是内置函数max的插件,CheckPlugin检查参数的个数和类型,ExecFunction则把参数转换为double然后把最大的放在ret中返回。

        这个插件没有用到pc和pe这两个参数,目前可以无视,因为这两个参数是客户代码使用的,插件解释器只是传递而并不操作,到需要用的时候你自然知道怎么用。 

二、插件管理器

	//插件表class CPluginMap{public:struct HANDLE{string plugin_name;bool isNULL()const { return 0 == plugin_name.size(); }};private:static map<string, CPlugin*>& GetPluginMap();public:template<typename T>static void addplugin(map<string, CPlugin*>& mapPlugins);static bool AddPlugin(char const* name, Variable::types type, CPlugin* p);static CPlugin* GetPlugin(string const& fun_name);static CPlugin* GetPlugin(HANDLE const& h);static string& PluginHelp(string& ret);};

        插件管理器管理所有的插件,也就是管理所有的自定义函数。

        子类型HANDLE是内部使用的,提供类似指针的快速访问,不过目前并没有性能优势,因为内部藏的还是自定义函数名。

        addPlugin往插件管理器里面添加插件,是静态方法。插件管理器的实现相当简单,也很随意,所以就不展开解释了。

        用户代码只需要在执行脚本前用addPlugin或AddPlugin添加插件即可。


(这里是结束,但是不是整个系列的结束)

http://www.dtcms.com/wzjs/811766.html

相关文章:

  • 网站店铺vr场景可以做吗开发区人才市场招聘信息最新招聘
  • 企业网站建设管理平台shopnc
  • 天津个人网站备案查询微信导航网站有用吗
  • 大城县企业网站建设微信里的小程序怎么打不开
  • 在线培训网站次要关键词上海站群优化
  • 岳阳建设厅网站水墨画风格网站
  • 网站开发费用报价单乐清网站制作推广
  • 网页设计与制作教程上海关键词排名优化价格
  • 网站建设多少钱一年wordpress调用导航代码
  • 公司网站的管理和维护it外包项目
  • 做网站要用框架吗小程序软件制作网站
  • 宜春建设网站青海餐饮网站建设
  • 电子商务网站前台建设常用的技术网站个人备案需要什么资料
  • 村志网站建设济南seo优化公司
  • 做网站要几天嘉定网站设计制作价格
  • 广州网站建站私自建设网站
  • 天猫网站建设论文手机网站程序
  • 用自己的电脑建网站wordpress更换主题出错
  • 免费建设游戏对战平台网站自己制作头像的网站 设计 动漫
  • 在墙外的优质网站深圳网站建设智能小程序
  • 拉销智能模板建站系统企业展厅设计公司价格表
  • 网站受到攻击 怎么做网站建设到运营需要多少钱
  • 网站开发课程总结个人网店和网站的区别
  • 国字类型网站有哪些内容百度seo优化及推广
  • 广州响应式网站开发长沙做网站最好的公司有哪些
  • 荣昌网站建设互助县wap网站建设公司
  • 做网站建怎么开发微信公众号呢
  • 网站建设的流程步骤软件大全下载app免费
  • 嘉兴网站建设公司遵义网站建设价格
  • 公益环保网站建设上海做网站公司