我试图弄清楚如何将比较运算符动态应用于 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
语句来做到这一点,但是有没有更优雅的方式来做到这一点,例如:
return val1 cmpr_string val2;
其中val1 = all_records[0]['price']
,val2 = 190
和cmpr_string
是 > 比较运算符(从“>”字符串转换为比较运算符。本质上,我想我正在寻找一种将字符串转换为某种运算符别名的方法,该运算符可以像这样使用原始运算符。如果我也可以将它用于除比较运算符之外的运算符(例如,+
和-
),那就太好了。
请注意,我使用boost::variant
了 for,all_records
因为实际上,这就是我将要做的(对于列表的不同成员,每个值可以是不同的类型)。如果它更容易,我可以放入一个系统来确保不同行中all_records
具有相同键的对具有相同的类型。所以,如果all_records[0]['price']
是 a double
,它将是double
所有的all_records[n]['price']