日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

可变参数模板(参考《C++ Templates 英文版第二版》)

發布時間:2023/12/10 c/c++ 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 可变参数模板(参考《C++ Templates 英文版第二版》) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

可變參數模板(參考《C++ Templates 英文版第二版》)

Chapter 4 可變參數模板

自從C++11,模板可以接受可變數量的參數

4.1 可變參數模板

可以定義模板,去接受無限數量的模板參數

這種行為的模板叫做可變參數模板

4.1.1 例子

#include <iostream>template<typename T> void print(T arg) {std::cout << arg << std::endl; }template<typename T, typename... Types> void print(T firstArg, Types... args) {std::cout << firstArg << '\n'; // print first argumentprint(args...); // call print() for remaining arguments }int main(int argc, char* argv[]) {print(1, 4, 7, "妙"); }

4.1.3 運算符sizeof

C++11 之后,sizeof操作符對于可變參數模板有新的用法sizeof...,他返回參數包里面包含多少個元素

template<typename T, typename... Types> void print(T firstArg, Types... args) {std::cout << sizeof... (Types) << std::endl;std::cout << sizeof... (args) << std::endl; }

4.2 折疊表達式

C++11 提供了可變模板參數包, 使函數可以接受任意數量的參數. 但在 C++11中展開參數包稍顯麻煩, 而 C++17 的折疊表達式使得展開參數包變得容易,其基本語法是使用 (...) 的語法形式進行展開.

支持的操作符

折疊表達式支持 32 個操作符: +, -, *, /, %, ^, &, |, =, <,>, <<, >>, +=, -=, *=, /=, %=, ^=, &=, |=, <<=,>>=,==, !=, <=, >=, &&, ||, ,, .*, ->*

  • 對于一元右折疊 (E op …) 具體展開為 E1 op (… op (EN-1 op EN)).
  • 對于一元左折疊 (… op E) 具體展開為 (( E1 op E2) op …) op En.
  • 對于二元右折疊 (E op … op I) 具體展開為 E1 op (… op (EN-1 op (EN op I))).
  • 對于二元左折疊 (I op … op E) 具體展開為 (((I op E1) op E2) op …) op E2.
// define binary tree structure and traverse helpers: struct Node {int value;Node* left;Node* right;Node(int i=0) : value(i), left(nullptr), right(nullptr) {}//... }; auto left = &Node::left; auto right = &Node::right;// traverse tree, using fold expression: template<typename T, typename... TP> Node* traverse (T np, TP... paths) {return (np ->* ... ->* paths); // np ->* paths1 ->* paths2 ... }int main() {// init binary tree structure:Node* root = new Node{0};root->left = new Node{1};root->left->right = new Node{2};//...// traverse binary tree:Node* node = traverse(root, left, right);//... }

使用(np->* ... ->* paths)這個折疊表達式去遍歷參數代表的路徑

使用折疊表達式我們可以實現打印參數列表

template<typename ... Types> void print(Types const&... args) {(std::cout << ... << args) << '\n'; }int main() {int a{ 12 };std::string b{ "博主是帥哥" };print(a, b); }

但是我們這個函數有個小缺陷,就是無法打印空格,讓我們來實現一下:

template<typename T> class AddSpace {private:T const& ref; // refer to argument passed in constructorpublic:AddSpace(T const& r): ref(r) {}friend std::ostream& operator<< (std::ostream& os, AddSpace<T> s) {return os << s.ref << ' '; // output passed argument and a space} };template<typename... Args> void print (Args... args) {( std::cout << ... << AddSpace(args) ) << '\n'; }

運行:

int main() {int a{ 12 };std::string b{ "博主是帥哥" };print(a, b); }

總結

以上是生活随笔為你收集整理的可变参数模板(参考《C++ Templates 英文版第二版》)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。