我试图弄清楚如何在c ++中动态地将比较运算符应用于两个变量。例如:
我有一个数据列表,例如:
#include <boost/variant/variant.hpp>
#include <list>
typedef boost::variant< short, int, long, long long, double, string > flex;
typedef pair<string, flex> flex_pair;
typedef list< flex_pair > row_entry;
list< row_entry > all_records; // This is the primary list
list< row_entry >::iterator all_records_it; // An iterator to move through the primary list
现在,让我们说all_records
中有一行看起来像这样:
all_records[0]["price"] = 220.45;
all_records[0]["time"] = 1336948802;
all_records[0]["name"] = "some item";
all_records[1]["price"] = 180.0;
all_records[1]["time"] = 1336948102;
all_records[1]["name"] = "another item";
我希望能够做到这样的事情:
comparer(all_records[0]['price'], 190, ">");
哪个会测试if(all_records[0]['price'] > 190)
并返回是否评估为真。同样,如果我这样做:
comparer(all_records[0]['price'], 190, "==");
它将测试if(all_records[0]['price'] == 190)
并返回是否评估为真
我知道我可以使用一堆if
/ else
语句或switch
语句来执行此操作,但是有更优雅的方法可以执行此操作,例如:< / p>
return val1 cmpr_string val2;
其中val1 = all_records[0]['price']
,val2 = 190
和cmpr_string
是&gt;比较运算符(从“&gt;”字符串转换为比较运算符。基本上,我想我正在寻找一种方法将字符串转换为某种运算符的别名,可以像原始运算符一样使用。它会如果我还可以将其用于除比较运算符之外的运算符(例如,+
和-
),那就太棒了。
请注意,我使用boost::variant
作为all_records
,因为实际上,这就是我将要做的事情(每个值对于列表的不同成员可以是不同的类型)。如果它更容易,我可以放入一个系统,以确保在all_records
的不同行中具有相同键的对具有相同的类型。因此,如果all_records[0]['price']
是double
,那么对于所有double
all_records[n]['price']