c++ - 从 C++ 中的自定义异构容器打印
问题描述
我正在阅读有关在 C++ 中构建自定义异构容器的博客。在博客中,作者使用访问者模式打印出容器中按类型排序的每个元素。我想知道我是否可以写一个访问者,以便我可以按照插入的顺序打印出元素?
解决方案
当您按类型存储元素时,您会丢失插入顺序,因此您必须更改
template<class T>
static std::unordered_map<const heterogeneous_container*, std::vector<T>> items;
经过
template <class T>
static std::unordered_map<const heterogeneous_container*,
std::vector<std::pair<std::size_t, T>>> items;
添加一个visit_ordered:
template <typename T, class V>
void visit_with_index_impl_help(V& visitor)
{
for (auto&& p : items<T>[this])
{
visitor(p.first, p.second);
}
}
template <class V, typename... Ts>
void visit_ordered_impl(V& visitor, type_list<Ts...>)
{
std::vector<std::pair<std::size_t, std::function<void()>> funcs;
const auto inserter = [&](std::size_t i, auto&& elem) {
funcs.emplace_back(i, visitor(elem));
};
(..., visit_with_index_impl_help<Ts>(inserter));
const auto less_by_first = [](const auto& lhs, const auto& rhs){ return lhs.first < rhs.first; };
std::sort(funcs.begin(), funcs.end(), less_by_first);
for (auto&& func : funcs) {
func();
}
}
template <class V>
void visit_ordered(V& visitor)
{
visit_ordered_impl(visitor, typename std::decay_t<V>::types{})
}
推荐阅读
- javascript - 为什么 splice 函数在 JavaScript 中不能正常工作?
- javascript - JavaScript/jQuery:将多个参数传递给 API 中的 POST 请求
- github - 无法将来自 IntelliJ 的 GitHub 与未知主机的消息连接
- c# - 我应该如何在 .NETStandard 1.3 中添加 System.Data.Table 引用?
- html - 背景图像显示图像的特定部分
- .net - .NET - 确保跨线程事件处理在处理表单后不会引发异常
- python-3.x - 如何更新,然后用 Python 和 DBUtils PersistentDB 选择更新的数据?
- angular - 传单 divIcon 未以角度显示在地图上
- json - 无法从 DynamoDB 数据库中为 Alexa 技能正确检索读取的 JSON 数据
- php - php中注册页面的数据库中的值未更新