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
  • 相关阅读:
    Hystrix服务降级
    postman使用教程12-预处理(pre-request) 发送请求
    postman使用教程11- sign 签名预处理(pre-request)
    postman使用教程10-请求前参数预处理(pre-request)
    postman使用教程9-点 code 按钮生成代码段
    postman使用教程8-设置断言(Tests脚本编写)
    postman使用教程7-参数化引用外部文件(txt/csv/json)测试数据
    postman使用教程6-引用随机变量($guid,$timestamp,$randomInt)
    postman使用教程5-Test脚本中自定义变量(参数关联 提取 token 和引用 token )
    postman使用教程4-集合变量(collection variables)的使用
  • 原文地址:https://www.cnblogs.com/qicosmos/p/4897535.html
Copyright © 2011-2022 走看看