根据元素类型获取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 + 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
时间: 2024-10-10 10:39:28

根据元素类型获取tuple中的元素的相关文章

JS获取网页中HTML元素的几种方法分析

getElementById getElementsByName getElementsByTagName 大概介绍 getElementById ,getElementsByName ,getElementsByTagName ###adv### 后两个是得到集合,byid只是得到单个对象 getElementById 的用法 举个例子: <a id="link1" name="link1" href=http://homepage.yesky.com>

0129 JavaScript 数组:概念、创建数组、获取数组中的元素

1.1 数组的概念 数组可以把一组相关的数据一起存放,并提供方便的访问(获取)方式. 数组是指一组数据的集合,其中的每个数据被称作元素,在数组中可以存放任意类型的元素.数组是一种将一组数据存储在单个变量名下的优雅方式. 1.2 创建数组 JS 中创建数组有两种方式: 利用 new 创建数组 var 数组名 = new Array() : var arr = new Array(); // 创建一个新的空数组 注意 Array () ,A 要大写 利用数组字面量创建数组 //1. 使用数组字面量方

C#获取网页中某个元素的位置,并模拟点击

我们在开发中,往往要得到网页中某个元素的位置,并且点击它.要模拟一次鼠标点击并不难,只要调用一个API就行了,关键就是怎么样得到这个元素的位置,还有判断是否要滚动滚动条,要滚动多少行能让元素显示出来.当然我们可以动态改变它的CSS,让它在特定的位置显示出来,但这个方法只对比较简单的网页有效. 那我们怎么才能得到网页的位置呢,首先我们来看一张图片 从这里我们可以看到五个offset的属性,这里我们主要利用offsetparent, offsetleft 和offsettop,我们用offsetpa

Js/Jquery获取iframe中的元素

在web开发中,经常会用到iframe,难免会碰到需要在父窗口中使用iframe中的元素.或者在iframe框架中使用父窗口的元素. JavaScript 在父窗口中获取iframe中的元素 格式:window.frames["iframe的name值"].document.getElementById("iframe中控件的ID").click(); 实例:window.frames["ifm"].document.getElementById

jQuery如何获取iframe中的元素

jQuery如何获取iframe中的元素:这个问题其实非常简单,既然要获取iframe中的元素,那么首先要获取iframe.关于获取iframe这里就不介绍了可以参阅父窗口和iframe中对象互相传值简介一章节. 下面直接看一段代码就能够很轻松明白: $(window.frames["main"].document).find("ul") 以上代码id属性值为main的iframe元素中的ul元素. 原文地址是:http://www.softwhy.com/foru

Js/Jquery获取iframe中的元素 在Iframe中获取父窗体的元素方法

在web开发中,经常会用到iframe,难免会碰到需要在父窗口中使用iframe中的元素.或者在iframe框架中使用父窗口的元素 js 在父窗口中获取iframe中的元素  1. 格式:window.frames["iframe的name值"].document.getElementByIdx_x("iframe中控件的ID").click(); 实例:window.frames["ifm"].document.getElementByIdx_

父窗口中获取iframe中的元素

js 在父窗口中获取iframe中的元素 1. Js代码   格式:window.frames["iframe的name值"].document.getElementById("iframe中控件的ID").click(); 实例:window.frames["ifm"].document.getElementById("btnOk").click(); 2. Java代码   格式: var obj=document.get

获取iframe中的元素

父窗口中获取iframe中的元素 var ifr = document.getElementById('suggustion').contentWindow.document.body; 在iframe中获取父窗口的元素 格式:window.parent.document.getElementByIdx_x("父窗口的元素ID").click(); 实例:window.parent.document.getElementByIdx_x("btnOk").click(

在iframe窗体内 获取父级的元素;;在父窗口中获取iframe中的元素

原文:在iframe窗体内 获取父级的元素::在父窗口中获取iframe中的元素 在iframe中获取父窗口的元素 $('#父窗口中的元素ID', parent.document).click(); 在父窗口中获取iframe中的元素 $("#iframe的ID").contents().find("#iframe中的控件ID").click(); 原文地址:https://www.cnblogs.com/lonelyxmas/p/8353815.html