根据元素类型获取tuple中的元素
2024-08-22 21:35:35
最近做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 + , Args...>::value;
}; template <class T, std::size_t N>
struct indexOf<T, N>
{
static constexpr auto value = -;
static_assert(value!=-, "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, , 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 + , Args...>::value};
}; template <class T, std::size_t N>
struct indexOf<T, N>
{
enum { value = - };
static_assert(value!=-, "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
最新文章
- mvc中form表单提交的几种形式
- bootstrap 20161012
- 【腾讯Bugly干货分享】从0到1打造直播 App
- 移动端自动化环境搭建-node.js的安装
- &ldquo;耐撕&rdquo;团队2016.04.14站立会议
- debug实战:进程Hang+High CPU
- PAT 1069. The Black Hole of Numbers (20)
- CH Round #57 - Story of the OI Class 凯撒密码
- leetcode 之 Unique Paths
- [QT]简单介绍一下 *.pro、*.pri、*.prf、*.prl等四种文件
- Hibernate的load()和get()区别
- springboot整合mybatis和mybatis-plus
- Xml文档规则
- 使用pyenv来管理python版本
- 深入浅出 JVM GC(2)
- 【个人阅读作业】软件工程M1/M2总结
- windows 启动关闭Oracle监听和服务
- js中时间戳转换成时间格式
- 网络对抗——web基础
- MVC 如何在action中获取当前网站的根路径
热门文章
- centos7.2 使用rpm安装jdk8
- Java实验-课程设计报告一:个人银行账户管理系统SavingAccountManageSystem-具体文档+源码
- spring的i o c简单回顾
- Microsoft Corporation 去掉 windows 修改 启动加载 版权
- Wed 基础
- mysql week 的使用方法
- Unity枚举和字符串的相互转换
- Cocos Creator代码编辑环境配置
- 使用 IntraWeb (28) - 基本控件之 TIWTemplateProcessorHTML、TIWLayoutMgrHTML、TIWLayoutMgrForm
- The system is running in low-graphics mode UB16