翻译来自: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 <tuple> // 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<x>(result); // Compile error
上面这行会导致编译错误,因为 x 不是编译时常量。下面几行可以正常工作
const int i = 1; // Get second double value from tuple double dVal3 = std::get<i>(result);
#include <iostream> #include <tuple> // 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<x>(result); const int i = 1; // Get second double value from tuple double dVal3 = std::get < i >(result); return 0; }