在编译期很容易根据索引来获取对应位置的元素,因为 tuple 的帮助函数 std::get<N>(tp) 就能获取 tuple 中第 N 个元素。然而我们却不能直接在运行期通过变量来获取 tuple 中的元素值,比如下面的用法:

;
std::get<i>(tp); 

  这样写是不合法的,会报一个需要编译期常量的错误。 要通过运行时的变最米获取 tuple 中的元素值,需要采取一些替代手法,将运行期变量“映射”为编译期常量。

  下面是基于C++14实现的,运行期以索引获取tuple元素的方法。需支持C++14及以上标准的编译器,VS2017 15.5.x、CodeBlocks 16.01 gcc 7.2。

//运行期以索引获取tuple元素-C++14
//需支持C++14及以上标准的编译器,VS2017 15.5.x、CodeBlocks 16.01 gcc 7.2
//自编

#include <iostream>
#include <tuple>
#include <utility>  //index_sequence
using namespace std;

template <typename Tuple>
void visit3(size_t i, Tuple& tup, index_sequence<>)
{
}

template <typename Tuple, size_t... Idx>
void visit3(size_t i, Tuple& tp, index_sequence<Idx...>)
{
    constexpr size_t I = index_sequence<Idx...>::size() - ;
    if (i == I)
        cout << get<I>(tp) << endl;
    visit3(i, tp, make_index_sequence<I>{});
}

template <typename Tuple>
void visit_help(size_t i, Tuple& tp)
{
    visit3(i, tp, make_index_sequence<tuple_size<Tuple>::value>{});
}

int main()
{
    auto tp = make_tuple(, "The test", true);
    ;
    visit_help(i, tp);  

    ;
}

运行期以索引获取tuple元素-C++14的更多相关文章

  1. 运行期以索引获取tuple元素-C++14(原创)

    在编译期很容易根据索引来获取对应位置的元素,因为 tuple 的帮助函数 std::get<N>(tp) 就能获取 tuple 中第 N 个元素.然而我们却不能直接在运行期通过变量来获取 ...

  2. 运行期以索引获取tuple元素-C++17

    //运行期以索引获取tuple元素-C++17 //需支持C++17及以上标准的编译器,VS2017 15.5.x.CodeBlocks 16.01 gcc 7.2 //参见:http://purec ...

  3. 运行期以索引获取tuple元素-C++11之2

    //运行期以索引获取tuple元素-C++11之2 //需支持C++11及以上标准的编译器,VS2017 15.5.x.CodeBlocks 16.01 gcc 7.2 //参见<深入应用C++ ...

  4. 运行期以索引获取tuple元素-C++11之1

    //运行期以索引获取tuple元素-C++11之1 //需支持C++11及以上标准的编译器,VS2017 15.5.x.CodeBlocks 16.01 gcc 7.2 //参见<深入应用C++ ...

  5. Knockout获取数组元素索引的2种方法,在MVC中实现

    原文:Knockout获取数组元素索引的2种方法,在MVC中实现 在遍历数组.集合的时候,通常要获取元素的索引,本篇体验使用Knockout获取索引的2种方法. 假设有这样的一个模型: namespa ...

  6. 获取某个元素第一次出现在数组(json数组)的索引

    function firstIndex(arr, text) { // 若元素不存在在数组中返回-1 let firstVal = -1; for (let i = 0; i < arr.len ...

  7. python中len 小练习:获取并输出集合中的索引及对应元素

    len()用来获取长度.字节等数值 1 a = ["hello", "world", "dlrb"] 2 b = len(a) 3 for ...

  8. jquery通过索引获取元素

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  9. JIT晚期(运行期)

    在部分的商用虚拟机(Sun HotSpot.IBM J9)中,Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为& ...

随机推荐

  1. Milking Time

    Description Bessie is such a hard-working cow. In fact, she is so focused on maximizing her producti ...

  2. Ignatius and the Princess IV(乱搞一发竟然过了)

    B - Ignatius and the Princess IV Time Limit:1000MS     Memory Limit:32767KB     64bit IO Format:%I64 ...

  3. Fibonacci again and again(SG函数应用)

    Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...

  4. lynx---CentOS终端访问IP

    1.官网 http://lynx.isc.org 2.稳定版本 http://invisible-mirror.net/archives/lynx/tarballs/lynx2.8.8rel.2.ta ...

  5. JavaNIO缓冲区

    package com.nio.test; import java.nio.ByteBuffer; import org.junit.Test; /** * * @author fliay * * 一 ...

  6. AngularJS学习篇(六)

    AngularJS 控制器 AngularJS 应用程序被控制器控制. ng-controller 指令定义了应用程序控制器. 控制器是 JavaScript 对象,由标准的 JavaScript 对 ...

  7. replace 使用函数作为第二参数

    var sToChange = “The sky is red.”;var reRed = /red/;var sResultText = sToChange.replace(reRed, funct ...

  8. 开发中关于Git那些事

    如果你想精通Git,直接到 Git官网 把这本ProGit掌握已足以Pro Git 此文主要介绍一切开发中常用的git命令和一些配置技巧(诸如git别名配置,log打印技巧,版本回退以及分支管理等). ...

  9. OpenCV畸变校正源代码分析

    图像算法中会经常用到摄像机的畸变校正,有必要总结分析OpenCV中畸变校正方法,其中包过普通针孔相机模型和鱼眼相机模型fisheye两种畸变校正方法. 普通相机模型畸变校正函数针对OpenCV中的cv ...

  10. selenium+testN自动化测试框架搭建

    自动化测试框架搭建 1 Java环境的搭建 1.1访问oracle的官网下载最新版本的jdk http://www.oracle.com/technetwork/java/javase/downloa ...