项目开发过程中虽然不建议使用过多的if-else-else if,但是总有一些情况是避免不了,举一个例子:
struct DataBase
{std::string type_;
};void Update(DataBase _data)
{if (_data.type_ == "UiSCLKey"){}else if (_data.type_ == "UiRadarKey"){}else if (_data.type_ == "UiChartKey"){}
}
比如像这种情况,Update函数是一个接口,外部调用该接口给该模块传输zmq的数据,模块拿到这个数据需要判断该数据是哪个topic发出来的数据,对不同的数据做不同的处理,在一个项目开发过程中我们需要接收的数据非常多,topic也非常多,我们不可能每次都通过这种if-else去判断这个数据是属于哪个topic,这太傻了,所以我们可以用映射表这样的方式。
它就是一个unordered_map,key值是topic,value值就是要处理的函数,这样我们在接收到数据的时候直接判断key值存不存在,存在的话就调用函数处理。
写法如下:
// 传输数据的结构体
struct DataBase
{std::string type_;
};// 处理zmq数据
void UiSclData(DataBase _data)
{}void UiRadarData(DataBase _data)
{}void UiChartData(DataBase _data)
{}// 成员变量
std::unordered_map<std::string, std::function<void(DataBase _data)>> data_map_;// 注册
void Register()
{data_map_["UiSCLKey"] = UiSclData;data_map_["UiRadarKey"] = UiRadarData;data_map_["UiChartKey"] = UiChartData;
}// 接口,外部调用传输数据
void Update(DataBase _data)
{if (data_map_.find(_data.type_) != data_map_.end())data_map_[_data.type_](_data);
}
data_map_是成员变量,Register函数可以在订阅数据的函数里调用,每次要订阅一个topic数据时在Register函数里加一行。
但是这样有个弊端,那就是所有处理数据的函数参数必须一致,返回值必须一致,所以有利有弊,看情况使用。