C++ 比较运算符

C++ 比较运算符,c++,vector,comparison-operators,C++,Vector,Comparison Operators,这可能是个愚蠢的问题。 是否有任何方法可以在运行时使用字符串变量指定比较运算符。 假设我有一个向量中的工资数据。 vector < int > salary; Input: salary[i] != /* ==,>,<,>=,<= (any comparison operator)) */ 9000. 向量工资; 输入: 工资[i]!=/*=,>,= 不可能。除非解析给定的输入并调用相应的操作。在任何情况下,您都需要一个if-else语句。您的编程语言中需要某种EVAL语

这可能是个愚蠢的问题。 是否有任何方法可以在运行时使用字符串变量指定比较运算符。
假设我有一个向量中的工资数据。

vector < int > salary;
Input:
salary[i] != /* ==,>,<,>=,<= (any comparison operator)) */ 9000.

向量工资;
输入:

工资[i]!=/*=,>,= 不可能。除非解析给定的输入并调用相应的操作。在任何情况下,您都需要一个if-else语句。

您的编程语言中需要某种EVAL语句,用于计算字符串


<>编辑:C++没有EVAL来支持你的事业。

< P>不,像C++这样的编译语言不能这样工作。在最后的可执行文件中必须有代码来进行比较,而设计C++不生成该代码,除非它实际上在源程序中。

您可能有一个
std::map
,其中字符串内容和指向运算符的指针之间有映射。

您可以创建一个映射,其中运算符字符串作为键,相应比较操作的函数对象作为值


创建地图:

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);
(有关完整的工作示例,请参见。)


编辑:

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

正如@sbi在下面的评论中所说,如果密钥不存在,那么使用
map[key]
访问映射将创建一个条目。所以用
it=map.find(key)
代替。如果结果等于
map.end()
则找不到键,否则值为
it->second
。在根据您的需要调整此解决方案时请注意这一点。

您还可以创建一个函子,它将字符串作为构造函数或工厂,从而生成不同的函子(取决于您需要的灵活性)

比如:

:输入 Comp-cmp=Comp(str)

if(cpm(工资[i],9000)) { cout你必须在这个必要的评估中“破解”;)即

模板
bool eval_op(常数串和op、常数T和lhs、常数T和rhs)
{
开关(操作大小())
{
案例2:
{
开关(op[1])
{
案例“=”:
{
开关(op[0])
{
案例“=”:返回lhs==rhs;
案例“!”:返回lhs!=rhs;
案例'>':返回lhs>=rhs;
案例“”:返回左侧>右侧;

case'在这种特殊情况下,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()
更安全,因为在这里您可以清理输入。您可以确保其中没有恶意代码,就像Bobby Tables攻击一样


诚然,您可以在这里使用多态性,但多态性的要点是支持开放式类型的备选方案。当您希望添加案例时,多态性允许您轻松完成。但是您需要做一些工作来建立基础,这里正好有6个比较备选方案。或者,如果您想添加对任意类型的支持,则有7个谓词。< /p> C++没有“<代码>”(代码)>抱歉。在香草C++中没有EVE“大多数编程语言都有EVE”是粗略的夸张。它只存在于一小部分语言中。C++也没有。根据你的评论编辑了答案。你能用简单的例子来阐述吗?参见MISSIG FAKOTER的答案:=std::equal_to();
另外,请注意,如果
键不存在,则使用
map[key]
访问映射将创建一个条目。通常您不希望这样。请改用
it=map.find(key)
。如果结果等于
map.end()
找不到密钥,否则值为
it->second
@sbi:谢谢你的提示。已编辑。:@missingfaktor-我们可以在没有boost的情况下执行此操作吗library@Jony:是的。您可以使用而不是
boost::function
“在任何情况下,您都需要if-else语句”。不,您不需要。