gpt4 book ai didi

c++ - 获取嵌套的类似STL的容器中的元素总数

转载 作者:行者123 更新时间:2023-12-01 14:43:29 24 4
gpt4 key购买 nike

我想编写一个C++函数,该函数可以计算具有以下条件的通用嵌套类STL容器中“原子”元素的总数:

  • 每个级别可以是任何类型的容器。
  • 级别数没有先验。

  • 我编写了以下递归函数(使用 here的代码):
    template <typename T>
    size_t get_total_size(const T & var)
    {
    if ( is_container<typeof(var)>::value ) { // From https://stackoverflow.com/a/9407521/2707864
    typename T::const_iterator iter;
    size_t sumsize = 0;
    for ( iter = var.begin() ; iter!= var.end() ; iter++ ) {
    sumsize += get_total_size(*iter);
    }
    return sumsize;
    } else {
    return 1;
    }
    };

    编译/链接可能会起作用。
    问题在于,使用时(否则,编写它就没有任何意义!)无法编译,因为实例化在“原子”级别变为了没有迭代器的类型,例如在此代码中
    typedef vector<int> vint;
    typedef vector<vint> vvint;
    vvint vec_heap;
    for (int i=0; i < 12; i++) {
    vec_heap.push_back(vint(2, i));
    }
    cout << get_total_size(vec_heap) << endl; // Instantiation leads to compilation errors

    这可能吗?

    编辑:
    根据一则评论,可以使用c++ 17完成...
    我为目标编写的递归函数是否过大?

    最佳答案

    在C++ 17中,您可以使用if constexpr:

    template <typename T>
    size_t get_total_size(const T& var)
    {
    if constexpr (is_container<T>::value) {
    return std::accumulate(var.begin(),
    var.end(),
    0u,
    [](int acc, const auto& e){ return acc + get_total_size(e); });
    } else {
    return 1u;
    }
    };

    在此之前,您可能会使用重载和SFINAE:
    // this will be called when T is not a container (it is the "atomic" type)
    template <typename T, std::enable_if_t<!is_container<T>::value, int> = 0>
    size_t get_total_size(const T& var)
    {
    return 1u;
    };
    // this will be called for all container types, except for maps
    template <typename T, std::enable_if_t<is_container<T>::value, int> = 0>
    size_t get_total_size(const T& var)
    {
    return std::accumulate(var.begin(),
    var.end(),
    0u,
    [](int acc, const auto& e){ return acc + get_total_size(e); });
    };
    // this will be called for maps
    template <typename Key, typename T>
    size_t get_total_size(const std::map<Key, T> & var)
    {
    return std::accumulate(var.begin(),
    var.end(),
    0u,
    [](int acc, const auto& e){ return acc + get_total_size_sfinae(e.second); });
    }

    关于c++ - 获取嵌套的类似STL的容器中的元素总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60104273/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com