将字符串转换为运算符

时间:2014-07-12 19:16:50

标签: c++ string operators

我正在实现一个模拟"条件跳转"的基本解释器功能。 它需要四个输入,

  1. 变量(字符类型)
  2. 运算符(< =,> ...)(字符串类型)
  3. 整数值(int type)
  4. 行号(int类型)
  5. 功能声明

    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;
    }
    

    有一种简单的方法吗? 我想过重载运算符,但我不确定它是否有效。

2 个答案:

答案 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;
}

如果这不是你想要的,那么我的猜测是你可能想要查看以下链接: