C++11:std::tuple


翻译来自:https://thispointer.com/c11-stdtuple-tutorial-examples/

在本文中,我们将讨论什么是 std::tuple 以及如何使用它。

什么是 std::tuple 以及我们为什么需要它?

std::tuple 是一种可以将固定大小的异构值绑定在一起的类型。我们需要在创建元组对象时将元素的类型指定为模板参数。

创建一个 std::tuple 对象

让我们声明一个 std::tuple,它是一个 int、double 和 std::string 的集合,即

// Creating a tuple of int, double and string
std::tuple<int, double, std::string> result(7, 9.8, "text");

现在,所有三种类型的变量都封装在一个对象中。我们也可以从函数中返回这个元组对象。所以,基本上它帮助我们从一个函数返回多个值。最终,它帮助我们避免创建不必要的结构。

需要头文件

#include  // std::tuple 需要

从 std::tuple 获取元素

我们可以使用 std::get 函数通过将索引值指定为模板参数来获取隐藏在元组对象中的元素。

让我们从元组对象中获取第一个元素,即

CODE// Get First int value from tuple
int iVal = std::get<0>(result);

同样从元组对象中获取第二个和第三个元素,即

// Get second double value from tuple
double dVal = std::get<1>(result);
// Get third string value from tuple
std::string strVal = std::get<2>(result);

从元组中获取超出范围的值

获取任何索引超过元组封装的元素数量的元素都会导致编译时错误。
例如,试图从 tuple 中获取第 4 个元素会导致编译时错误,因为这个 tuple 对象只有 3 个元素,即

// Get 4th int value from tuple
// Will cause compile error because this tuple
// has only 3 elements
int iVal2 = std::get<4>(result); // Compile error

从元组获取值时类型转换错误

同样,从元组获取元素时使用错误的类型也会导致错误,即

// Wrong cast will force compile time error
// Get first value from tuple in a string
std::string strVal2 = std::get<0>(result); // Compile error

上面这行会导致编译错误,因为元组中第一个元素的类型是 int 而不是 string

通过动态索引从元组中获取值

std::get 中的模板参数应该是编译时常量,否则会导致编译时错误即

int x = 1;
 
// Get second double value from tuple
// Compile error because x is not compile time contant
double dVal2 = std::get(result); // Compile error

上面这行会导致编译错误,因为 x 不是编译时常量。下面几行可以正常工作

const int i = 1;
// Get second double value from tuple
double dVal3 = std::get(result);
#include 
#include  // Required for std::tuple
#include <string>
/*
 * Returning multiple values from a function by binding them in a single
 * tuple object.
 */
std::tuple<int, double, std::string> someFunction()
{
    // Creating a tuple of int, double and string
    std::tuple<int, double, std::string> result(7, 9.8, "text");
    // Returning tuple object
    return result;
}
int main()
{
    // Get tuple object from a function
    std::tuple<int, double, std::string> result = someFunction();
    // Get values from tuple
    // Get First int value from tuple
    int iVal = std::get < 0 >(result);
    // Get second double value from tuple
    double dVal = std::get < 1 >(result);
    // Get third string value from tuple
    std::string strVal = std::get < 2 >(result);
    // Print values
    std::cout << "int value = " << iVal << std::endl;
    std::cout << "double value = " << dVal << std::endl;
    std::cout << "string value = " << strVal << std::endl;
    // Get 4th int value from tuple
    // Will cause compile error because this tuple
    // has only 3 elements
    //int iVal2 = std::get<4>(result); // Compile error
    // Wrong cast will force compile time error
    // Get first value from tuple in a string
    //std::string strVal2 = std::get<0>(result); // Compile error
    int x = 1;
    // Get second double value from tuple
    // Compile error because x is not compile time contant
    //double dVal2 = std::get(result);
    const int i = 1;
    // Get second double value from tuple
    double dVal3 = std::get < i >(result);
    return 0;
}