看到一篇文:
https://www.cnblogs.com/qicosmos/p/4325949.html
讲到了模板函数递归展开不定参数包,突然想起一段段代码如下:
void MediaSource::for_each_media(const function<void(const Ptr &src)> &cb,
const string &schema,
const string &vhost,
const string &app,
const string &stream) {
deque<Ptr> src_list;
{
lock_guard<recursive_mutex> lock(s_media_source_mtx);
//递归调用每次都少一个,比如:
//第一次schema, vhost, app, stream
//第二次 vhost, app, stream
//第三次 app, stream
//最后一次 stream
for_each_media_l(s_media_source_map, src_list, schema, vhost, app, stream);
}
for (auto &src : src_list) {
cb(src);
}
}
template<typename MAP, typename LIST, typename First, typename ...KeyTypes>
static void for_each_media_l(const MAP &map, LIST &list, const First &first, const KeyTypes &...keys) {
if (first.empty()) {
for (auto &pr : map) {
for_each_media_l(pr.second, list, keys...);
}
return;
}
auto it = map.find(first);
if (it != map.end()) {
for_each_media_l(it->second, list, keys...);
}
}
template<typename MAP, typename LIST, typename First>
static void for_each_media_l(const MAP &map, LIST &list, const First &first) {
if (first.empty()) {
for (auto &pr : map) {
emplace_back(list, pr.second);
}
return;
}
auto it = map.find(first);
if (it != map.end()) {
emplace_back(list, it->second);
}
}
本文介绍了C++中使用模板函数递归展开处理不定参数包的技术,通过示例展示了如何遍历多级映射结构,如在媒体源管理中的应用,实现按指定条件查找并回调处理所有媒体源。
710

被折叠的 条评论
为什么被折叠?



