【问题标题】:Convert string to operator [closed]将字符串转换为运算符 [关闭]
【发布时间】:2014-09-03 04:25:18
【问题描述】:

我正在实现一个模拟“条件跳转”的基本解释器函数。 它需要四个输入,分别是

  1. 变量(字符类型)
  2. 运算符( ...)(字符串类型)
  3. 整数值(int类型)
  4. 行号(int类型)

函数声明

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

有没有一种简单的方法可以做到这一点? 我想过重载运算符,但我不确定它是否有效。

【问题讨论】:

  • 我不清楚你在问什么。
  • 有没有办法将字符串类型转换为运算符类型?
  • 你能贴出函数的签名,解释一下参数代表什么,函数应该做什么?
  • 我认为你所拥有的是最简单的实现
  • 不存在“算子类型”这回事吧?您想要var (op) immediate 之类的东西,其中op 被评估为参数之间的运算符。 C++ 中没有这样的东西;你唯一能做的就是以更复杂的方式编写你已经拥有的东西,可以说更干净/更易读,但原则上功能相同。

标签: c++ string operators


【解决方案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 作为映射中的值。不过,您必须编写更多设置。就此而言,您已经拥有的代码可能会更快。

【讨论】:

【解决方案2】:

我认为您要问的是如何将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;
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-24
    • 2018-05-06
    • 2011-07-04
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    相关资源
    最近更新 更多