老实说:我认为这不是你描述的一个好主意,但确实有潜力。
这限制了 C++ 的静态参数数量的“烦人”负担,这可能是也可能不是您想要的语言。
想象一下——你想表示一个函数:
VM::allFunctions["functionName"](variable1);
但是该函数需要两个参数!我们如何定义一个动态参数函数?带“ ...
” - 这意味着stdargs.h
和va_list
。不幸的是, va_list 有缺点 - 你必须提供一个额外的变量,它会以某种方式向你提供关于有多少变量的信息,所以我们将我们虚构的函数调用更改为:
VM::allFunctions["functionName"](1, variable1);
VM::allFunctions["functionWithtwoArgs"](2, variable1, variable2);
这给您带来了一个新问题 - 在运行时,无法传递多个参数!所以我们必须将这些参数组合成可以在运行时定义和使用的东西,让我们(假设地)将它定义为
typedef std::vector<Variable* > VariableList;
我们现在的电话是:
VM::allFunctions["functionName"](varList);
VM::allFunctions["functionWithtwoArgs"](varList);
现在我们进入“作用域”——没有作用域就不能“执行”一个函数——尤其是在嵌入式脚本语言中,你可以拥有多个虚拟机(沙盒等),所以我们必须有一个Scope
类型,这将假设的调用更改为:
currentVM->allFunctions["functionName_twoArgs"].call(varList, currentVM->currentScope);
我可以继续说下去,但我想你明白我的回答的重点——C++ 不喜欢动态语言,它很可能不会改变以适应它,因为它很可能也会改变 ABI。
希望这将带您走向正确的方向。