Я работаю с картой функций для простого языка, который я разрабатываю, все работает отлично, но я хотел бы предоставить лучший способ определить числовые операторы, которые работают с численными значениями в более сжатой форме.Использование аргументов шаблона внутри 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>()); }));
..
Так в основном для каждого оператора, который поддерживает как float
и int
типов данных я должен предоставить 4 функцию, которая работает с возможными комбинациями
int, int -> int
int, float -> float
float, int -> float
float, float -> float
Теперь я не хочу предоставлять неявное преобразование типов, поэтому я в порядке с 4 различными функциями для каждой комбинации, но мне хотелось бы определить их все сразу, не повторяя код ,
Проблема заключается в том, как я мог сделать это, главная проблема заключается в лямбда:
[](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>(...);
..
}
Но я не найти умный способ сделать это, потому что мне нужно передать лямбда-методу, который должен быть параметрическим. Я не знаю, возможно ли вообще.
Что такое 'Тип'? – CoffeeandCode
@CoffeeandCode: 'enum Тип: u8', это не проблема, так как я могу использовать' std :: условный', чтобы выбрать правильный в соответствии с двумя типами операторов. – Jack