zoukankan      html  css  js  c++  java
  • c++ 使用模板按类型统计stl多维容器中元素的数量

    struct ItemCounter
    {
    template<typename T1, typename T2, typename = typename std::enable_if<!std::is_same<T1, typename T2::value_type::second_type>::value>::type>
    static typename T2::value_type::second_type::size_type Count(const T2 &container) {
    typename T2::value_type::second_type::size_type ret = 0;
    for (const auto &item : container) {
    ret += ItemCounter::Count<T1>(item.second);
    }
    return ret;
    }
    template<typename T1, typename T2, typename = typename std::enable_if<!std::is_same<T1, typename T2::value_type>::value>::type>
    static typename T2::value_type::size_type Count(const T2 &container) {
    typename T2::value_type::size_type ret = 0;
    for (const auto &item : container) {
    ret += ItemCounter::Count<T1>(item);
    }
    return ret;
    }
    template<typename T1, typename T2, typename = typename std::enable_if<std::is_same<T1, typename T2::value_type>::value>::type>
    static typename T2::size_type Count(const T2 &container)
    {
    return container.size();
    }
    template<typename T1, typename T2, typename = typename T2::value_type::second_type, typename = typename std::enable_if<std::is_same<T1, typename T2::value_type::second_type>::value>::type>
    static typename T2::size_type Count(const T2 &container)
    {
    return container.size();
    }
    };

    template<typename T, typename TContainer>
    size_t ItemCount(const TContainer &container)
    {
    return ItemCounter::Count<T>(container);
    }

    代码重构时会方便很多,支持value_type为T和pair<X,T>类型的容器

    例如原来:

    std::vector<A> arr;

    size_t sz = arr.size();

    重构后:

    std::map<std::string, std::vector<A> > mapped_arr;

    size_t sz = ItemCount<A>(mapped_arr);

  • 相关阅读:
    案例------存储过程
    案例------冒泡排序
    案例------递归调用
    天气预报接口api(中国天气网)
    【转】ubuntu64,ndk-r9 编译 ffmpeg 2.1.1的config文件
    android权限大全
    JNI 回调小记
    java设置环境变量小工具
    bootstrap之双日历时间段选择控件—daterangepicker(汉化版)
    一个 bootstrap 弹出框插件
  • 原文地址:https://www.cnblogs.com/niukuo/p/8325716.html
Copyright © 2011-2022 走看看