1

我试图弄清楚如何将比较运算符动态应用于 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 = 190cmpr_string是 > 比较运算符(从“>”字符串转换为比较运算符。本质上,我想我正在寻找一种将字符串转换为某种运算符别名的方法,该运算符可以像这样使用原始运算符。如果我也可以将它用于除比较运算符之外的运算符(例如,+-),那就太好了。

请注意,我使用boost::variant了 for,all_records因为实际上,这就是我将要做的(对于列表的不同成员,每个值可以是不同的类型)。如果它更容易,我可以放入一个系统来确保不同行中all_records具有相同键的对具有相同的类型。所以,如果all_records[0]['price']是 a double,它将是double所有的all_records[n]['price']

4

0 回答 0