最近做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

最新文章

  1. mvc中form表单提交的几种形式
  2. bootstrap 20161012
  3. 【腾讯Bugly干货分享】从0到1打造直播 App
  4. 移动端自动化环境搭建-node.js的安装
  5. &ldquo;耐撕&rdquo;团队2016.04.14站立会议
  6. debug实战:进程Hang+High CPU
  7. PAT 1069. The Black Hole of Numbers (20)
  8. CH Round #57 - Story of the OI Class 凯撒密码
  9. leetcode 之 Unique Paths
  10. [QT]简单介绍一下 *.pro、*.pri、*.prf、*.prl等四种文件
  11. Hibernate的load()和get()区别
  12. springboot整合mybatis和mybatis-plus
  13. Xml文档规则
  14. 使用pyenv来管理python版本
  15. 深入浅出 JVM GC(2)
  16. 【个人阅读作业】软件工程M1/M2总结
  17. windows 启动关闭Oracle监听和服务
  18. js中时间戳转换成时间格式
  19. 网络对抗——web基础
  20. MVC 如何在action中获取当前网站的根路径

热门文章

  1. centos7.2 使用rpm安装jdk8
  2. Java实验-课程设计报告一:个人银行账户管理系统SavingAccountManageSystem-具体文档+源码
  3. spring的i o c简单回顾
  4. Microsoft Corporation 去掉 windows 修改 启动加载 版权
  5. Wed 基础
  6. mysql week 的使用方法
  7. Unity枚举和字符串的相互转换
  8. Cocos Creator代码编辑环境配置
  9. 使用 IntraWeb (28) - 基本控件之 TIWTemplateProcessorHTML、TIWLayoutMgrHTML、TIWLayoutMgrForm
  10. The system is running in low-graphics mode UB16