根据元素类型获取tuple中的元素
2015-10-21 13:42
369 查看
最近做cinatra遇到这样的需求,根据一个type来获取对应的第一个元素,需要注意的一个问题是,如果没有这个类型的时候,通过编译期断言提醒使用者,实现代码如下:
1.C++14实现
2.C++11的实现方法
把enum换成const int也没问题,如果完全用C++11的方式去做那就用std::integral_constant吧,代码如下:
注意,integral_constant方式,加断言不起作用,不过会返回一个无效的-1,在外层也会出现断言提示,问题不大。
测试代码:
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
相关文章推荐
- Qt小技巧(1)
- 採購單單別/稅別選錯,怎麼辦?
- Let's Encrypt 正式出發(免费HTTPS证书即将到来)
- [树莓派]启用root账户
- Metasploit使用Hash直接登录Windows
- 文章标题
- FFmpeg常用基本命令
- 最简单的基于FFmpeg的libswscale实例
- 二叉树
- SQL語法實例分享--UPDATE進階
- 静态链接库与动态链接库
- ubuntu环境下使用apt-get配置apache+php+mysql
- linux 中ps命令
- 数据结构_二叉树
- SQL語法--Unicode長度的取得
- start.s 解析(一)
- 南邮编程在线编程题十三:最大公约数
- VS2013中无法从XXX转换为“LPCWSTR”问题的解决
- resin4.0.44+websocket 实现私信功能服务端消息推送
- Linux下将MySql静态编译到程序中