我正在使用我正在开发的一种简单语言的函数映射,一切正常但我想提供一种更好的方法来定义数值运算符,这些运算符以更简洁的方式处理数值。
主要问题是我有类似的东西:
using BinaryFunction = std::function<StackValue(StackValue,StackValue)>;
registerFunction("+", Type::FLOAT, {Type::FLOAT, Type::FLOAT}, BinaryFunction([](StackValue v1, StackValue v2) { return StackValue(v1.as<float>() + v2.as<float>()); }));
registerFunction("+", Type::FLOAT, {Type::FLOAT, Type::INT}, BinaryFunction([](StackValue v1, StackValue v2) { return StackValue(v1.as<float>() + v2.as<s32>()); }));
..
所以基本上对于支持float
和int
数据类型的每个运算符,我必须提供4个与可能组合一起使用的函数
int, int -> int
int, float -> float
float, int -> float
float, float -> float
现在我不想提供隐式类型转换,所以我很好地为每个组合提供了4个不同的函数,但是我想要一种方法来同时定义它们而不必重复代码。
问题是我怎么做,主要问题在于lambda:
[](StackValue v1, StackValue v2) { return StackValue(v1.as<float>() + v2.as<float>()); };
为了能够做我需要的东西,我需要一种用模板来参数化代码的方法,比如
return StackValue(v1.as<T1>() + v2.as<T2>())
然后StackValue<T>(T)
的正确专长将负责其余部分。
这样我就可以做类似
的事了registerNumericFunction(...)
{
registerTemplate<float, float>(...);
registerTemplate<s32, float>(...);
..
}
但我找不到一个聪明的方法,因为我需要将lambda传递给应该是参数的方法。我不知道是否有可能。