这可能是一个愚蠢的问题。
有没有办法在运行时使用字符串变量给比较运算符。
假设我有一个向量的薪水数据。
vector < int > salary;
Input:
salary[i] != /* ==,>,<,>=,<= (any comparison operator)) */ 9000.
如上所述给出的输入。我将比较运算符存储在字符串str中。 str =(任何比较运算符)。如果没有if并切换,有没有办法检查这样。
salary str 9000
答案 0 :(得分:15)
您可以使用operator-strings作为键和函数对象创建一个映射,以便将相应的比较操作作为值。
创建地图:
std::map<std::string, boost::function<bool(int, int)> > ops;
ops["=="] = std::equal_to<int>();
ops["!="] = std::not_equal_to<int>();
ops[">"] = std::greater<int>();
ops["<"] = std::less<int>();
ops[">="] = std::greater_equal<int>();
ops["<="] = std::less_equal<int>();
使用它:
bool resultOfComparison = ops[str](salary[i], 9000);
(有关完整的工作示例,请参阅this link。)
修改强>
正如@sbi在下面的评论中所说,如果密钥不存在,使用map[key]
访问地图将创建一个条目。所以请改用it = map.find(key)
。如果结果等于map.end()
,则找不到密钥,否则值为it->second
。请注意这一点,同时根据您的需求调整此解决方案。
答案 1 :(得分:1)
但是,你可能有一个std::map
,其中包含字符串内容和指向运算符的指针之间的映射。
答案 2 :(得分:0)
没有。不可能。除非你解析给定的输入并调用相应的操作。无论如何,你需要一个if - else语句。
答案 3 :(得分:0)
您需要在编程语言中使用某种EVAL来评估字符串。
编辑:C ++没有EVAL来支持你的事业。
答案 4 :(得分:0)
不,像C ++这样的编译语言不能像那样工作。在最终的可执行文件中必须有代码进行比较,并且按照设计,C ++不会生成该代码,除非它实际上在源程序中。
答案 5 :(得分:0)
您还可以创建一个仿函数,它将字符串作为构造函数或工厂,它将生成不同的仿函数(取决于您需要的灵活性)。
类似于:
:输入 Comp cmp = Comp(str);
if(cpm(salary [i],9000)) { cout&lt;&lt; “哇”; }
答案 6 :(得分:0)
你必须在这个必需的评估中“破解”! ;)即
template <typename T>
bool eval_op(const string& op, const T& lhs, const T& rhs)
{
switch(op.size())
{
case 2:
{
switch(op[1])
{
case '=':
{
switch(op[0])
{
case '=': return lhs == rhs;
case '!': return lhs != rhs;
case '>': return lhs >= rhs;
case '<': return lhs <= rhs;
}
}
default: throw("crazy fool!");
};
}
case 1:
{
switch(op[0])
{
case '>': return lhs > rhs;
case '<': return lhs < rhs;
default: throw ("crazy fool!");
}
}
default: throw ("crazy fool!");
}
return false;
}
免责声明:我没有对此进行测试......但这是一个想法...
答案 7 :(得分:0)
在这种特殊情况下,if-else分支是您最简单的解决方案。这只是因为只有这么多的比较选择,你可以肯定其他任何一个都不会存在。实质上,您的代码应该与
一致if( in == "==" )
cond = salary[i] == 9000;
else if( in == "!=" )
cond = salary[i] != 9000;
// ...
else
// throw, return -1, raise a flag or burst out in laughter
这实际上比动态eval()
更安全,因为在这里您可以清理输入。你确保那里没有恶意代码,就像Little Bobby Tables攻击一样。
当然,你可以在这里使用多态,但多态性的观点是支持开放式的替代品。当您希望添加案例时,多态性允许您轻松地执行此操作。但是你需要做一些工作来建立基础,这里有6个比较选择。或者7,如果你想添加对任意谓词的支持。