zoukankan      html  css  js  c++  java
  • 根据元素类型获取tuple中的元素

    最近做cinatra遇到这样的需求,根据一个type来获取对应的第一个元素,需要注意的一个问题是,如果没有这个类型的时候,通过编译期断言提醒使用者,实现代码如下:

    1.C++14实现

    template <class T, std::size_t N, class... Args>
    struct indexOf;
    
    template <class T, std::size_t N, class... Args>
    struct indexOf<T, N, T, Args...>
    {
        static constexpr auto value = N;
    };
    
    template <class T, std::size_t N, class U, class... Args>
    struct indexOf<T, N, U, Args...>
    {
        static constexpr auto value = indexOf<T, N + 1, Args...>::value;
    };
    
    template <class T, std::size_t N>
    struct indexOf<T, N>
    {
        static constexpr auto value = -1;
        static_assert(value!=-1, "the type is not exist");
    };
    
    template <class T, class... Args>
    T get_element_by_type(const std::tuple<Args...>& t)
    {
        return std::get<indexOf<T, 0, Args...>::value>(t);
    }

    2.C++11的实现方法

    template <class T, std::size_t N, class... Args>
    struct indexOf;
     
    template <class T, std::size_t N, class... Args>
    struct indexOf<T, N, T, Args...>
    {
        enum { value = N };
    };
     
    template <class T, std::size_t N, class U, class... Args>
    struct indexOf<T, N, U, Args...>
    {
        enum { value = indexOf<T, N + 1, Args...>::value};
    };
     
    template <class T, std::size_t N>
    struct indexOf<T, N>
    {
        enum { value = -1 };
        static_assert(value!=-1, "the type is not exist");
    };

    把enum换成const int也没问题,如果完全用C++11的方式去做那就用std::integral_constant吧,代码如下:

    template <class T, std::size_t N, class... Args>
    struct indexOf;
     
    template <class T, std::size_t N, class... Args>
    struct indexOf<T, N, T, Args...> : std::integral_constant<int, N>
    {
    };
     
    template <class T, std::size_t N, class U, class... Args>
    struct indexOf<T, N, U, Args...> : std::integral_constant<int, indexOf<T, N + 1, Args...>::value>
    {
    };
     
    template <class T, std::size_t N>
    struct indexOf<T, N> : std::integral_constant < int, -1 >
    {
    };
     
    template <class T, class... Args>
    T get_element_by_type(const std::tuple<Args...>& t)
    {
    	return std::get<indexOf<T, 0, Args...>::value>(t);
    }
    

     

    注意,integral_constant方式,加断言不起作用,不过会返回一个无效的-1,在外层也会出现断言提示,问题不大。

    测试代码:

    std::tuple<int, double, char, short> tp = std::make_tuple(1, 2.3, 2, 1);
    //auto r = get_element_by_type<string>(tp); //编译期断言错误
    auto r = get_element_by_type<double>(tp); //返回2.3
  • 相关阅读:
    Linux:修改Shell命令提示符及颜色
    Linux:cut命令详解
    pageadmin去掉xxx
    高手详解SQL性能优化十条经验
    一道简单递归题
    list<?>转换成 对应的 class
    《一道笔试题》找出最连续数字的最大长度
    poi 获取excel数据 导入数据库
    有一个5ml 的瓶子 和3ml 的瓶子 和 很多水 现在 要取出4ml的水 请写出编程 多种解法
    假设字符串类似这样的aba和aab,abc和bca就相等,现在随便给你二组字符串,请编程比较他们看是否相等
  • 原文地址:https://www.cnblogs.com/qicosmos/p/4897535.html
Copyright © 2011-2022 走看看