根据元素类型获取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 ...
随机推荐
- mysql-ubuntu卸载安装mysql
安装MySQL sudo apt-get install mysql-server mysql-client 查看状态 是否是运行中 sudo service mysql status 启动MySQL ...
- DB安装
start from the execute file : DB2_ESE_10_Win_x86-64\setup.exe Navigator to "Install a Product&q ...
- asp.net获取浏览器端操作系统名称
/// <summary>/// 获取浏览器端操作系统名称/// </summary>/// <returns></returns>public sta ...
- JavaScript访问对象属性
在JavaScript中,可以使用“ . ”和“ [ ] ”访问对象的属性. 1.点表示法 使用“ . ”运算符来存取一个对象的属性时,属性名是用标识符表示的.而在JavaScript程序中,标识符必 ...
- BZOJ.3757.苹果树(树上莫队)
题面链接 /* 代码正确性不保证..(不过交了SPOJ没WA T了最后一个点) 在DFS序做莫队 当一个点不是另一个点的LCA时,需要加上它们LCA的贡献 */ #include <cmath& ...
- css 类选择器结合元素选择器和多类选择器
1.结合元素选择器 <p class="important">css</p> p.important {color: red} 匹配class属性包含imp ...
- Java中的ReentrantLock和synchronized两种锁定机制
原文:http://www.ibm.com/developerworks/cn/java/j-jtp10264/index.html 多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之 ...
- Maven deploy部署jar到远程私服仓库
一.配置私服账号密码 修改maven配置文件,在$MAVEN_HOME/conf/setting.xml中增加如下配置: 注意,这里配置的id为releases何snapshots,当然可以改为其他, ...
- java中关于AtomicInteger的使用
在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字.而AtomicInteger则通过一种线程安全的加减操作接口.咳哟参考我之前写的一篇 ...
- iOS:使用莱文斯坦距离算法计算两串字符串的相似度
Levenshtein:莱文斯坦距离 Levenshtein的经典算法,参考http://en.wikipedia.org/wiki/Levenshtein_distance的伪代码实现的,同时参考了 ...