我试图在C ++中实现一个非常基本的redis克隆。所以当我得到查询时,我需要解析它们。现在我这样做:
void Query::buildQuery(){
std::string query_type = lower(args[0]);
if(query_type == "get"){ //do something }
else if(query_type == "set"){ //do something }
else if(query_type == "getbit"){ //do something }
else if(query_type == "setbit"){ //do something }
else if(query_type == "zadd"){ //do something }
else if(query_type == "zcard"){ //do something }
else if(query_type == "zcount"){ //do something }
else if(query_type == "zrange"){ //do something }
else if(query_type == "save"){ //do something }
else { throw(QueryException("Invalid query type")); }
}
还有其他更短的方法吗?我不想包括除STL之外的任何其他库。
答案 0 :(得分:3)
如果可以将这些do_something
提取到单独的方法中,那么您可以从字符串创建预初始化的哈希映射(unordered_map
)到指向成员函数的指针,并执行类似
(this->*queryHandlers[query_type])();
但是,你必须在很多功能和一个大功能之间做出选择。
答案 1 :(得分:0)
如果没有if...else if
,您可以通过switch
语句执行此操作。像:
void Query::buildQuery(){
std::string query_type = lower(args[0]);
switch(str2int(query_type) ){
case str2int("set"):// do something
break;
case str2int("getbit"):// do something
break;
................
..........
default:
throw(QueryException("Invalid query type"));
}
}
constexpr unsigned int str2int(const char* str, int h = 0)
{
return !str[h] ? 5381 : (str2int(str, h+1)*33) ^ str[h];
}
答案 2 :(得分:0)
如果你在英特尔/ AMD处理器上运行并且感觉'勇敢',你可能想看看使用SSE指令的these implementations of strcmp, strlen, etc。那会更快。
至于一般结构,你可以转“set”& “做一些事情”进入一个有测试方法和做某事方法的类。有一个数组,并遍历它调用传递query_type的测试方法。如果对象的测试方法与字符串匹配,则会自动调用do-something方法。