根据元素类型获取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 + , 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
根据元素类型获取tuple中的元素的更多相关文章
- 获取父窗口元素或者获取iframe中的元素(相同域名下)
jquery方法 在父窗口中获取iframe中的元素 //方法1 $("#iframe的ID").contents().find("iframe中的元素"); ...
- Js/Jquery获取iframe中的元素
转载: Js/Jquery获取iframe中的元素 - - ITeye技术网站http://java-my-life.iteye.com/blog/1275205 在web开发中,经常会用到ifram ...
- js 获取iframe中的元素
今天要修改编辑器插件中的元素遇到的问题 jquery 在父窗口中获取iframe中的元素 1.Js代码 格式:$("#iframe的ID").contents().find(&qu ...
- 获取iframe中的元素
父窗口中获取iframe中的元素 var ifr = document.getElementById('suggustion').contentWindow.document.body; 在ifram ...
- Js/Jquery获取iframe中的元素 在Iframe中获取父窗体的元素方法
在web开发中,经常会用到iframe,难免会碰到需要在父窗口中使用iframe中的元素.或者在iframe框架中使用父窗口的元素 js 在父窗口中获取iframe中的元素 1. 格式:window ...
- 【学习】如何用jQuery获取iframe中的元素
(我的博客网站中的原文:http://www.xiaoxianworld.com/archives/292,欢迎遇到的小伙伴常来瞅瞅,给点评论和建议,有错误和不足,也请指出.) 说实在的,以前真的很少 ...
- 父窗口中获取iframe中的元素
js 在父窗口中获取iframe中的元素 1. 格式:window.frames["iframe的name值"].document.getElementById("ifr ...
- 在iframe窗体内 获取父级的元素;;在父窗口中获取iframe中的元素
在iframe中获取父窗口的元素 $(‘#父窗口中的元素ID’, parent.document).click(); 在父窗口中获取iframe中的元素 $(“#iframe的ID”).content ...
- [JavaScript] 获取数组中相同元素的个数
/** * 获取数组中相同元素的个数 * @param val 相同的元素 * @param arr 传入数组 */ function getSameNum(val,arr){ processArr ...
随机推荐
- 005 Spark快速入门的简单程序案例
参考:官网的quick start http://spark.apache.org/docs/1.6.0/quick-start.html 这里只是在shell命令行中简单的书写一些命令,做一个简单的 ...
- 各种浏览器下的页面元素xpath获取方法
参考链接: http://blog.sina.com.cn/s/blog_654c6ec70100v1i2.html
- 键盘键码Key Code
来源:https://www.cambiaresearch.com/articles/15/javascript-char-codes-key-codes Key Code backspace 8 t ...
- 用js来实现那些数据结构03(数组篇03-排序及多维数组)
终于,这是有关于数组的最后一篇,下一篇会真真切切给大家带来数据结构在js中的实现方式.那么这篇文章还是得啰嗦一下数组的相关知识,因为数组真的太重要了!不要怀疑数组在JS中的重要性与实用性.这篇文章分为 ...
- 爬虫三Scrapy
Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. Scrapy吸引人 ...
- Python:安装MYSQL Connector
在Python中安装MySQL Connector有如下三种方法: 1.直接安装客户端[建议使用] pip install mysqlclient 2.安装mysql连接器 pip install - ...
- Altium Designer Summer 09换成中文步骤
1.打开Altium Designer Summer 09软件,在左上角file文件中点击,再打开Preferences出现如下,然后关闭软件在打开就完成了
- Springzz中使用监听器,用于容器一启动就加载准备数据(application范围内的数据,用于减轻服务器压力,不用每次都去查数据)
java代码: public class InitListener implements ServletContextListener { public void contextInitialized ...
- C++ 引用 & 的详解
转载来自:CSDNinsistGoGo (http://blog.csdn.net/insistgogo/article/details/6655077) 引用的应用: 常引用: 语法: const ...
- 3dmax多个版本软件的安装包以及安装教程
这个文档具体出自哪里,我也是记不得了,需要的看下,链接如果是失效,那我也无能为力了. 免费分享,链接永久有效 2014版3D MAX链接:http://pan.baidu.com/s/1nuFr7Xv ...