【问题标题】:Printing from a custom heterogeneous container in C++从 C++ 中的自定义异构容器打印
【发布时间】:2021-03-17 01:18:07
【问题描述】:

我正在阅读有关在 C++ 中构建 custom heterogeneous container 的博客。在博客中,作者使用访问者模式打印出容器中按类型排序的每个元素。我想知道我是否可以写一个访问者,以便我可以按照插入的顺序打印出元素?

【问题讨论】:

    标签: c++ containers heterogeneous-array


    【解决方案1】:

    当你按类型存储元素时,你会丢失插入顺序,所以你必须改变

    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{})
    }
    

    【讨论】:

    • std::pair&lt;std::size_t T&gt;&gt; 是做什么的?
    • @Surt:错字:缺少逗号,std::pair&lt;std::size_t, T&gt;&gt;
    猜你喜欢
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    • 2012-04-27
    • 1970-01-01
    • 2018-02-25
    • 2011-12-09
    相关资源
    最近更新 更多