1. 程式人生 > 其它 >C++11:std::tuple

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 <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;
}