暴露给脚本系统的C ++函数 - 自描述参数类型

时间:2010-01-10 23:46:10

标签: c++ xml rule-engine

C ++规则引擎在XML中定义规则,其中每个规则归结为“if X,then Y”,其中X是一组测试,Y是一组操作。 在C ++代码中,测试/操作中可用的“函数”被创建为每个“函数”的类,每个函数都有一个“run(args)”方法......每个函数都有自己的一组参数。

这很好用。

但是,需要一个单独的工具来保存用户手工制作XML;规则引擎针对的是非程序员。该工具需要知道所有可用的“功能”,以及它们所需的输入参数。考虑这样做的最佳方法是什么?我考虑了几种可能性:

  1. 配置文件描述'函数'及其参数,并由工具读取。这很简单,实际的C ++代码可以使用它来执行参数验证,但C ++和XML仍然不能保证同步 - 程序员可以修改C ​​++并忘记更新XML导致验证错误
  2. 每个'function'类都有描述它的方法。不知怎的,这个工具加载了C ++类...这在支持反射的语言中很容易,但在C ++中更加混乱,可能你必须用所有“函数”或类似东西构建一个特殊的DLL。这意味着额外的开销。
  3. 特别是考虑到C ++的本质,有什么意义?

    编辑:标题是描述性的吗?我想不出更好的一个。

2 个答案:

答案 0 :(得分:2)

还有第三种方式 - IDL。

想象一下,您有一个客户端 - 服务器应用程序,并且您有一个代码生成器,可以生成可以在客户端和服务器上部署的包装类,以便用户可以使用客户端API编写应用程序并在服务器上进行处理。这是典型的RPC场景,用于DCE-RPC,ONC-RPC,CORBA,COM等。

这里的技巧是定义客户端可以调用的方法的签名,这是在接口定义语言中完成的。这并不困难,但它是客户端/服务器API的源代码,您通过生成器运行它并生成您编译供客户端使用的C ++类。

在您的情况下,听起来XML就是IDL。因此,您可以创建一个获取XML的工具,并生成描述代码公开的函数的C ++标头。你真的不必生成cpp文件(你可以),但它更容易生成头文件,所以添加新函数/参数的程序员不能忘记更新实现 - 它只是不会编译头文件已被重新生成。

如果只有函数定义,那么您可以生成#included到现有c ++标头中的标头。

所以 - 这是我的建议,#3:从你的权威XML签名中生成定义。

答案 1 :(得分:0)

还有另一种方式:

  • 在函数调用中添加参数类型统一的约束。
  • 定义一些最大数量的参数
  • 描述类型和优先级,即 double转换为String但反之亦然

然后你有

void f(int a1) .. f(int a1 .. int aN)
void f(double a1) .. f(double a1 .. double aN)
..
void f(T a1) .. 

以及其他具体数据类型,如String,Date等。

优点:

  • 签名固定和常规的变化
  • 可能只提供“最大”类型签名(T)
  • 适用于模板和语言桥梁
  • 可以使用2个整数参数未定义
  • 警告动作f