C++11:std::tuple
阿新 • • 發佈:2021-11-23
翻譯來自: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 tupleint 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; }