Я хочу выполнить двоичную операцию между двумя числами и иметь неявное приведение.
Например, я хочу иметь возможность добавлять int к double и вернуть double или добавить long к double и вернуть double.
Код эваулятора для двоичного выражения записывается следующим образом
Код: Выделить всё
std::any Interpreter::visitBinaryExpression(BinaryExpression& binaryExpression)
{
std::any left = binaryExpression.left->accept(*this);
std::any right = binaryExpression.right->accept(*this);
Token_t op = binaryExpression.op;
if (left.type() == typeid(short) && right.type() == typeid(short))
{
return eva_num(std::any_cast(left), op, std::any_cast(right));
}
if (left.type() == typeid(int) && right.type() == typeid(int))
{
return eva_num(std::any_cast(left), op, std::any_cast(right));
}
if (left.type() == typeid(long) && right.type() == typeid(long))
{
return eva_num(std::any_cast(left), op, std::any_cast(right));
}
if (left.type() == typeid(float) && right.type() == typeid(float))
{
return eva_num(std::any_cast(left), op, std::any_cast(right));
}
if (left.type() == typeid(double) && right.type() == typeid(double))
{
return eva_num(std::any_cast(left), op, std::any_cast(right));
}
if (left.type() == typeid(bool) && right.type() == typeid(bool))
{
return eva_bool(std::any_cast(left), op, std::any_cast(right));
}
std::string left_err = left.type().name();
std::string right_err = right.type().name();
throw std::invalid_argument("Runtime Error: couldn't evaluate type '" + left_err + "' with type '" + right_err + "'");
}
Проблема в том, что, поскольку я использую std: :any Мне нужно проверить каждый сценарий на предмет типа переменной. И в результате я получу более 100 операторов IF, что звучит неправильно.
Я пытался заменить std::any на std: :variant но у меня все равно будет более 100 операторов if.
Я пытался использовать метапрограммирование, но я действительно не знаю, как это реализовать (я новичок)кто-нибудь знаете, как решить эту проблему без жестокого написания всех операторов if?
Подробнее здесь: https://stackoverflow.com/questions/781 ... erpreter-c