我正在实现一个模拟"条件跳转"的基本解释器功能。 它需要四个输入,
void ProgramState::conditionalJump(int var, std::string op, int immediate, int destination);
// condition: Compares var and immediate using op
// if condition is true: modify current address to destination if the
// if false: nothing happens
例如,我可以编写一个非常粗略的实现,如下所示:
if ( (op == "<") && (var < immediate) ){
cur_line = destination;
}
有一种简单的方法吗? 我想过重载运算符,但我不确定它是否有效。
答案 0 :(得分:1)
你真正要求做的事情是不可能的,C ++没有办法将数据“转换”成代码。
你可以(可以说)改进一系列单独的测试,例如从字符串到执行比较的仿函数的映射。
设置代码:
std::map<std::string, std::function<bool(int, int)> comparisons;
comparisons["<"] = std::less<int>();
comparisons[">"] = std::greater<int>();
... etc ...
使用代码(不是特别有效但简洁的版本):
if (comparisons.count(op) && comparisons[op](var, immediate)) {
cur_line = destination;
}
对于性能,您可能希望使用函数指针而不是std::function
作为地图中的值。但是,您必须编写更多设置。就此而言,您已经拥有的代码可能会更快。
答案 1 :(得分:1)
我认为您要问的是如何将std::string
转换为relational operator
。好吧,我不知道用元编程实现这一点的方法,但字符串类只有6 relational operators。所以我只是将它们硬编码到函数中。
示例:
void conditionalJump(int var, std::string op, int immediate, int destination)
{
if ((op == "==") && (var == immediate)) cur_line = destination;
else if ((op == "!=") && (var != immediate)) cur_line = destination;
else if ((op == "<") && (var < immediate)) cur_line = destination;
else if ((op == ">") && (var > immediate)) cur_line = destination;
else if ((op == "<=") && (var <= immediate)) cur_line = destination;
else if ((op == ">=") && (var >= immediate)) cur_line = destination;
}
如果这不是你想要的,那么我的猜测是你可能想要查看以下链接: