c++11 標準模板(STL)(std::tuple)(二)

?

定義于頭文件 <tuple>

template< class... Types >
class tuple;

(C++11 起)

類模板 std::tuple 是固定大小的異類值匯集。它是 std::pair 的推廣。

若 (std::is_trivially_destructible_v<Types> && ...) 為 true ,則 tuple 的析構函數是平凡的。

(C++17 起)

模板形參

Types...-tuple 所存儲的元素的類型。支持空列表。

?

構造函數

std::tuple<Types...>::tuple

constexpr tuple();

(1)(C++11 起)
(條件性 explicit)

tuple( const Types&... args );

(2)(C++11 起)
(C++14 起為 constexpr)
(條件性 explicit)

template< class... UTypes >
tuple( UTypes&&... args );

(3)(C++11 起)
(C++14 起為 constexpr)
(條件性 explicit)

template< class... UTypes >
tuple( const tuple<UTypes...>& other );

(4)(C++11 起)
(C++14 起為 constexpr)
(條件性 explicit)

template <class... UTypes>
tuple( tuple<UTypes...>&& other );

(5)(C++11 起)
(C++14 起為 constexpr)
(條件性 explicit)

template< class U1, class U2 >
tuple( const pair<U1,U2>& p );

(6)(C++11 起)
(C++14 起為 constexpr)
(條件性 explicit)

template< class U1, class U2 >
tuple( pair<U1,U2>&& p );

(7)(C++11 起)
(C++14 起為 constexpr)
(條件性 explicit)

tuple( const tuple& other ) = default;

(8)(C++11 起)

tuple( tuple&& other ) = default;

(9)(C++11 起)

template< class Alloc >
tuple( std::allocator_arg_t, const Alloc& a );

(10)(C++11 起)
(C++20 起為 constexpr)
(條件性 explicit)
template< class Alloc >

tuple( std::allocator_arg_t, const Alloc& a,

? ? ? ?const Types&... args );
(11)(C++11 起)
(C++20 起為 constexpr)
(條件性 explicit)
template< class Alloc, class... UTypes >

tuple( std::allocator_arg_t, const Alloc& a,

? ? ? ?UTypes&&... args );
(12)(C++11 起)
(C++20 起為 constexpr)
(條件性 explicit)
template <class Alloc, class... UTypes>

tuple( std::allocator_arg_t, const Alloc& a,

? ? ? ?const tuple<UTypes...>& other );
(13)(C++11 起)
(C++20 起為 constexpr)
(條件性 explicit)
template< class Alloc, class... UTypes >

tuple( std::allocator_arg_t, const Alloc& a,

? ? ? ?tuple<UTypes...>&& other );
(14)(C++11 起)
(C++20 起為 constexpr)
(條件性 explicit)
template< class Alloc, class U1, class U2 >

tuple( std::allocator_arg_t, const Alloc& a,

? ? ? ?const pair<U1, U2>& p );
(15)(C++11 起)
(C++20 起為 constexpr)
(條件性 explicit)
template< class Alloc, class U1, class U2 >

tuple( std::allocator_arg_t, const Alloc& a,

? ? ? ?pair<U1, U2>&& p );
(16)(C++11 起)
(C++20 起為 constexpr)
(條件性 explicit)
template< class Alloc >

tuple( std::allocator_arg_t, const Alloc& a,

? ? ? ?const tuple& other );
(17)(C++11 起)
(C++20 起為 constexpr)
template< class Alloc >

tuple( std::allocator_arg_t, const Alloc& a,

? ? ? ?tuple&& other );
(18)(C++11 起)
(C++20 起為 constexpr)

?構造新的 tuple

1) 默認構造函數。值初始化所有元素。

此重載僅若 std::is_default_constructible<Ti>::value 對所有 i 為 true 才參與重載決議。

構造函數若且唯若對至少一個 iTi 不可從 {} 復制列表初始化才為 explicit 。

2) 直接構造函數。以對應參數初始化 tuple 的每個元素。

此重載僅若 sizeof...(Types) >= 1 與 std::is_copy_constructible<Ti>::value 對所有 i 為 true 才參與重載決議。

此構造函數若且唯若 std::is_convertible<const Ti&, Ti>::value 對至少一個 i 為 false 才為 explicit 。

3) 轉換構造函數。以 std::forward<UTypes>(args) 中的對應值初始化 tuple 的每個元素。

此重載僅若 sizeof...(Types) == sizeof...(UTypes) 且 sizeof...(Types) >= 1 與 std::is_constructible<Ti, Ui&&>::value 對所有 i 為 true 才參與重載決議。

構造函數若且唯若才 std::is_convertible<Ui&&, Ti>::value 對至少一個 i 為 false 為 explicit 。

4) 轉換復制構造函數。對 sizeof...(UTypes) 中所有 i ,以 std::get<i>(other) 初始化 tuple 的第 i 個元素。

此重載僅若

sizeof...(Types) == sizeof...(UTypes) 且
std::is_constructible_v<Ti, const Ui&> 對所有 i 為 true 且
sizeof...(Types) != 1 或

Types... 展開成 TUTypes... 展開成 U 時) std::is_convertible_v<const tuple<U>&, T> 、 std::is_constructible_v<T, const tuple<U>&> 與 std::is_same_v<T, U> 均為 false 才參與重載決議。

構造函數若且唯若 std::is_convertible<const Ui&, Ti>::value 對至少一個 i 為 false 才為 explicit 。

5) 轉換移動構造函數。對 sizeof...(UTypes) 中所有 i ,以 std::forward<Ui>(std::get<i>(other)) 初始化 tuple 的第 i 個元素。

此重載僅若

sizeof...(Types) == sizeof...(UTypes) 且
std::is_constructible_v<Ti, Ui&&> 對所有 i 為 true 且
sizeof...(Types) != 1 或

Types... 展開成 TUTypes... 展開成 U 時) std::is_convertible_v<tuple<U>, T> 、 std::is_constructible_v<T, tuple<U>> 與 std::is_same_v<T, U> 均為 false 才參與重載決議。

構造函數若且唯若 std::is_convertible<Ui&&, Ti>::value 對至少一個 i 為 false 才為 explicit 。

6) pair 復制構造函數。構造 2-tuple ,從 p.first 構造第一個元素,從 p.second 構造第二個元素。

此重載僅若 sizeof...(Types) == 2 與 std::is_constructible<T0,const U1&>::value 與 std::is_constructible<T1, const U2&>::value 均為 true 才參與重載決議。

構造函數若且唯若 std::is_convertible<const U1&, T0>::value 或 std::is_convertible<const U2&, T1>::value 為 false 才為 explicit 。 }}

7) pair 移動構造函數。構造 2-tuple ,從 std::forward<U1>(p.first) 構造第一個元素,從 std::forward<U2>(p.second) 構造第二個元素。

此重載僅若 sizeof...(Types) == 2 與 std::is_constructible<T0, U1&&>::value 與 std::is_constructible<T1, U2&&>::value 均為 true 才參與重載決議。

構造函數若且唯若 std::is_convertible<U1&&, T0>::value 或 std::convertible<U2&&, T1>::value 為 false 才為 explicit 。

8) 隱式定義的復制構造函數。以 other 的對應元素初始化 tuple 的每個元素。

若此函數進行的每個操作都是 constexpr ,則它是 constexpr 。對于空 tuple std::tuple<> ,它是 constexpr 。

要求 std::is_copy_constructible<Ti>::value 對所有 i 為 true 。

9) 隱式定義的移動構造函數。以 std::forward<Ui>(std::get<i>(other)) 構造 tuple 的第 i 個元素。

若此函數進行的每個操作都是 constexpr ,則它是 constexpr 。對于空 tuple std::tuple<> ,它是 constexpr 。

要求 std::is_move_constructible<Ti>::value 對所有 i 為 true 。

10-18) 等同于 (1-9) ,除了以使用分配器構造創建每個元素每個元素,即以分配器 (Allocator) 對象 a 為額外參數傳遞給每個 std::uses_allocator<Ui, Alloc>::value 為 true 的對象的構造函數。

參數

args-用于初始化 tuple 每個元素的值
other-用于初始化 tuple 每個元素的值的 tuple
p-用于初始化此 2-tuple 的兩個元素的值的 pair
a-用于使用分配器構造的分配器

?

注意

條件性 explicit 的構造函數使得可以用列表初始化語法于復制初始化語境構造 tuple :

std::tuple<int, int> foo_tuple() 
{return {1, -1};  // N4387 前錯誤return std::make_tuple(1, -1); // 始終工作
}

注意若列表中某元素不可隱式轉換成目標 tuple 中的對應元素,則構造函數變為 explicit 。

using namespace std::chrono;
void launch_rocket_at(std::tuple<hours, minutes, seconds>);launch_rocket_at({hours(1), minutes(2), seconds(3)}); // OK
launch_rocket_at({1, 2, 3}); // 錯誤: int 不可隱式轉換成 duration
launch_rocket_at(std::tuple<hours, minutes, seconds>{1, 2, 3}); // OK

調用示例

#include <tuple>
#include <iostream>
#include <string>
#include <typeinfo>
#include <stdexcept>
#include <iostream>
#include <vector>
#include <memory>// 打印任何大小 tuple 的輔助函數
template<class Tuple, std::size_t N>
struct TuplePrinter
{static void print(const Tuple& t){TuplePrinter < Tuple, N - 1 >::print(t);std::cout << ", " << std::get < N - 1 > (t);}
};template<class Tuple>
struct TuplePrinter<Tuple, 1>
{static void print(const Tuple& t){std::cout << std::get<0>(t);}
};template<class... Args>
void print(const std::tuple<Args...>& t)
{std::cout << "(";TuplePrinter<decltype(t), sizeof...(Args)>::print(t);std::cout << ")" << std::endl;
}
// 輔助函數結束int main()
{//1) 默認構造函數。值初始化所有元素。std::tuple<int, std::string, double> tuple1;std::cout << "Value-initialized: ";print(tuple1);//2) 直接構造函數。以對應參數初始化 tuple 的每個元素。std::tuple<int, std::string, double> tuple2(42, "Test", -3.14);std::cout << "Initialized with values: ";print(tuple2);//3) 轉換構造函數。以 std::forward<UTypes>(args) 中的對應值初始化 tuple 的每個元素。std::tuple<char, std::string, int> tuple3(std::move(tuple2));std::cout << "Implicitly converted: ";print(tuple3);//4) 轉換復制構造函數。對 sizeof...(UTypes) 中所有 i ,以 std::get<i>(other) 初始化 tuple 的第 i 個元素。std::tuple<char, std::string, int> tuple4(tuple2);std::cout << "Implicitly converted: ";print(tuple4);//5) 轉換移動構造函數。對 sizeof...(UTypes) 中所有 i ,//以 std::forward<Ui>(std::get<i>(other)) 初始化 tuple 的第 i 個元素。std::tuple<char, std::string, int> tuple5(std::move(tuple2));std::cout << "Implicitly converted: ";print(tuple5);//6) pair 復制構造函數。構造 2-tuple ,從 p.first 構造第一個元素,從 p.second 構造第二個元素。std::tuple<int, double> tuple6(std::make_pair(42, 3.14));std::cout << "Constructed from a pair";print(tuple6);//7) pair 移動構造函數。構造 2-tuple ,從 std::forward<U1>(p.first) 構造第一個元素,//從 std::forward<U2>(p.second) 構造第二個元素。std::pair<int, double> pair1 = std::make_pair(42, 3.14);std::tuple<int, double> tuple7(std::move(pair1));std::cout << "Constructed from a pair";print(tuple7);//8) 隱式定義的復制構造函數。以 other 的對應元素初始化 tuple 的每個元素。std::tuple<char, std::string, int> tuple8(tuple2);std::cout << "Implicitly converted: ";print(tuple8);//9) 隱式定義的移動構造函數。以 std::forward<Ui>(std::get<i>(other)) 構造 tuple 的第 i 個元素。std::tuple<char, std::string, int> tuple9(std::move(tuple2));std::cout << "Implicitly converted: ";print(tuple9);return 0;
}

輸出

Value-initialized: (0, , 0)
Initialized with values: (42, Test, -3.14)
Implicitly converted: (*, Test, -3)
Implicitly converted: (*, , -3)
Implicitly converted: (*, , -3)
Constructed from a pair(42, 3.14)
Constructed from a pair(42, 3.14)
Implicitly converted: (*, , -3)
Implicitly converted: (*, , -3)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714319.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714319.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714319.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

設計模式-備忘錄模式(C++)

備忘錄模式&#xff08;Memento Pattern&#xff09;是一種設計模式&#xff0c;用于在不破壞對象封裝的情況下&#xff0c;捕獲和保存對象的內部狀態&#xff0c;并在需要時恢復到之前的狀態。下面是一個簡單的 C 實現備忘錄模式的示例&#xff1a; #include <iostream>…

2024理解這幾個安全漏洞,你也能做安全測試!

如今安全問題顯得越來越重要&#xff0c;一個大型的互聯網站點&#xff0c;你如果每天查看日志&#xff0c;會發現有很多嘗試攻擊性的腳本。 如果沒有&#xff0c;證明網站影響力還不夠大。信息一體化的背后深藏著各類安全隱患&#xff0c;例如由于開發人員的不嚴謹導致為Web應…

章節一、認識three.js與開發環境學習筆記01;

一、如何學習WEB可視化3D技術與課程內容演示&#xff1b; 1、項目案例&#xff1a; 政府有大量的新基建的項目&#xff1a;如數字孿生、智慧城市、智慧園區、智慧工廠、智慧消防等等都涉及了3d的可視化技術&#xff1b; 2、如何系統的學號WEB 3D可視化技術&#xff1f; three…

網絡安全學習筆記1

1.了解kali及安裝 vmware安裝&#xff0c;用戶名密碼均為kali 2.metasploit是什么 3.metasploit攻擊windows系統 在kali中打來終端 數據msfconsole 進入metasploit的控制終端界面 msf的使用法則&#xff1a; 1.使用模塊 2.配置模塊必選項 3.運行模塊 三步操作、實現對…

邏輯回歸與交叉熵--九五小龐

什么是邏輯回歸 線性回歸預測的是一個連續值&#xff0c;邏輯回歸給出的“是”和“否”的回答 Singmoid sigmoid函數是一個概率分布函數&#xff0c;給定某個輸入&#xff0c;它將輸出為一個概率值 邏輯回歸損失函數 平方差所懲罰的是與損失為同一數量級的情形&#xff0…

8、Redis-Jedis、Lettuce和一個Demo

目錄 一、Jedis 二、Lettuce 三、一個Demo Java集成Redis主要有3個方案&#xff1a;Jedis、Lettuce和Redisson。 其中&#xff0c;Jedis、Lettuce側重于單例Redis&#xff0c;而Redisson側重于分布式服務。 項目資源在文末 一、Jedis 1、創建SpringBoot項目 2、引入依賴 …

電商小程序10分類管理

目錄 1 分類數據源2 搭建功能3 創建變量讀取數據4 綁定數據總結 本篇我們介紹一下電商小程序的分類管理功能的開發&#xff0c;先看我們的原型圖&#xff1a; 在首頁我們是展示了四個分類的內容&#xff0c;采用上邊是圖標&#xff0c;下邊是文字的形式。使用低代碼開發&#…

【系統分析師】-需求工程

一、需求工程 需求工程分為需求開發和需求管理。 需求開發&#xff1a;需求獲取&#xff0c;需求分析&#xff0c;需求定義、需求驗證。 需求管理&#xff1a;變更控制、版本控制、需求跟蹤&#xff0c;需求狀態跟蹤。&#xff08;對需求基線的管理&#xff09; 1.1需求獲取…

MySQL:合并查詢語句

1、查詢表的數據 t_book表數據 SELECT * FROM db_book.t_book; t_booktype表數據 SELECT * FROM db_book.t_booktype; 提醒&#xff1a; 下面的查詢操作的數據來自上圖查詢表的數據 2. 使用 UNION 查詢結果合并&#xff0c;會去掉重復的數據 使用UNION關鍵字是&#xff0c;數…

社區店經營口號大揭秘:如何吸引更多顧客?

社區店的經營口號是吸引顧客的重要工具&#xff0c;一個好的口號能夠在短時間內傳達店鋪的特色和價值&#xff0c;并引起顧客的興趣。 作為一名開鮮奶吧5年的創業者&#xff0c;我將分享一些關于社區店經營口號的干貨&#xff0c;幫助你吸引更多的顧客。 1、突出獨特賣點&…

群控代理IP搭建教程:打造一流的網絡爬蟲

目錄 前言 一、什么是群控代理IP&#xff1f; 二、搭建群控代理IP的步驟 1. 獲取代理IP資源 2. 配置代理IP池 3. 選擇代理IP策略 4. 編寫代理IP設置代碼 5. 異常處理 三、總結 前言 群控代理IP是一種常用于網絡爬蟲的技術&#xff0c;通過使用多個代理IP實現并發請求…

優思學院|3步驟計算出Cpk|學習Minitab

在生產和質量管理中&#xff0c;準確了解和控制產品特性至關重要。一個關鍵的工具是Cpk值&#xff0c;它是衡量生產過程能力的重要指標。假設我們有一個產品特性的規格是5.080.02&#xff0c;通過收集和分析過程數據&#xff0c;我們可以計算出Cpk值&#xff0c;進而了解生產過…

CentOS 定時調度

文章目錄 一、場景說明二、腳本職責三、參數說明四、操作示例五、注意事項 一、場景說明 本自動化腳本旨在為提高研發、測試、運維快速部署應用環境而編寫。 腳本遵循拿來即用的原則快速完成 CentOS 系統各應用環境部署工作。 統一研發、測試、生產環境的部署模式、部署結構、…

Java中靈活使用Mockito

目錄 Java中靈活使用Mockito引言Mockito簡介基本用法實例演示使用場景和案例解決方案結語 Java中靈活使用Mockito 引言 Mockito是Java中常用的mock框架之一&#xff0c;用于進行單元測試時模擬對象的行為。本文將介紹Mockito的基本用法&#xff0c;并探討如何在實際項目中靈活…

AP8P059 PIR 人體感應太陽能 LED 燈控制芯片

概述 AP8P059 是一款集成低壓 LDO、光控、充電控制、過充保護、欠壓保護、PIR感應、延時為一體的人體感應太陽能 LED燈控制芯片&#xff0c;只需要很少的外接元件&#xff0c;適用于鋰電池供電的PIR人體感應LED燈具的應用。外置的一級帶通增益放大器便于客戶調整感應靈敏度&am…

QT MinGW64編譯vlc源碼

編譯環境搭建 參考文章《QT Mingw32/64編譯ffmpeg源碼生成32/64bit庫以及測試》&#xff0c;搭建msys64環境&#xff1b; 運行msys.exe,運行&#xff1a; pacman -S git subversion cvs automake autoconf libtool m4 make gettext pkg-config mingw-w64-i686-lua findutils …

docker配置數據默認存儲路徑graph已過時,新版本中是data-root

錯誤信息 我在修改/etc/docker/daemon.json文件中&#xff0c;添加存儲路徑graph字段。然后sudo systemctl restart docker包如下錯誤&#xff1a;使用journalctl -xeu docker.service錯誤信息&#xff0c;發現不能匹配graph字段。 原因 我的docker版本&#xff1a; 在doc…

mybatisplus整合flowable-ui-modeler報錯

1、問題 Description:file [/Users/xingyuwei/Documents/project/java/springboot_01/target/classes/com/xingyu/mapper/TemplateMapper.class] required a single bean, but 2 were found:- sqlSessionFactory: defined by method sqlSessionFactory in class path resource…

TypeScript08:在TS中使用模塊化

前言&#xff1a;tsconfig.json中的配置 一、前端領域中的模塊化標準 前端領域中的模塊化標準有&#xff1a; ES6、commonjs、amd、umd、system、esnext 二、 TS中如何書寫模塊化語句 TS 中&#xff0c;導入和導出模塊&#xff0c;統一使用 ES6 的模塊化標準。 myModule.ts &a…

Keil新版本安裝編譯器ARMCompiler 5.06

0x00 緣起 我手頭的項目在使用最新版本的編譯器后&#xff0c;燒錄后無法正常運行&#xff0c;故安裝5.06&#xff0c;測試后發現程序運行正常&#xff0c;以下為編譯器的安裝步驟。 0x01 解決方法 1. 下載編譯器安裝文件&#xff0c;可以去ARM官網下載&#xff0c;也可以使用我…