在lambda

时间:2015-09-09 15:33:17

标签: c++ templates c++11 lambda

我正在使用我正在开发的一种简单语言的函数映射,一切正常但我想提供一种更好的方法来定义数值运算符,这些运算符以更简洁的方式处理数值。

主要问题是我有类似的东西:

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>()); }));
..

所以基本上对于支持floatint数据类型的每个运算符,我必须提供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传递给应该是参数的方法。我不知道是否有可能。

0 个答案:

没有答案