1. 程式人生 > >可變引數模板(Variadic Templates)

可變引數模板(Variadic Templates)

要解決的問題:

  • 怎麼建立一個擁有1個、2個或者更多的初始化器的類?
  • 怎麼避免建立一個例項而只拷貝部分的結果?
  • 怎麼建立一個元組?

最後的問題是關鍵所在:考慮一下元組!如果你能建立並且訪問一般的元組,那麼剩下的問題也將迎刃而解。
這裡有一個例子(摘自“可變引數模板簡述(A brief introduction to Variadic templates)”(參見參考)),要構建一個廣義的、型別安全的printf()。這個方法比用boost::format好的多,但是考慮一下:

1 2 3 4 const string pi = “pi”;
const char* m = “The value of %s is about %g (unless you live in %s).n”; printf(m,  pi, 3.14159,  “Indiana”);

這是除了格式字串之外,沒有其它引數的情況下呼叫printf()的一個最簡單的例子了,所以我們將要首先解決:

1 2 3 4 5 6 7 8 9 void printf(const char* s)   
{ while (s && *s) { if (*s==’%’ && *++s!=’%')  //保證沒有更多的引數了 //%%(轉義字元,在格式字串中代表% throw runtime_error(“格式非法: 缺少引數”); std::cout << *s++<<endl; } }

這個處理好之後,我們必須處理有更多引數的printf():

1 2 3 4 5 6 7 8 9 10 11 12 13 template<typename T, typename... Args>    // 注意這裡的"..." void printf(const char* s, T value, Args... args)   // 注意"..." { while (s && *s) { //一個格式標記(避免格式控制符) if

相關推薦

可變引數模板Variadic Templates

要解決的問題: 怎麼建立一個擁有1個、2個或者更多的初始化器的類?怎麼避免建立一個例項而只拷貝部分的結果?怎麼建立一個元組? 最後的問題是關鍵所在:考慮一下元組!如果你能建立並且訪問一般的元組,那麼剩下的問題也將迎刃而解。 這裡有一個例子(摘自“可變引數模板簡述(A brief intr

可變引數模板--案例2實現自己的printf

利用可變模板引數自定義printf函式,直接上程式碼。 /******************************************* * Name:      example2.cpp * Describe:  可變模板引數例項2:重寫printf * Au

C++反射機制:可變引數模板實現C++反射

### 1. 概要   2018年Bwar釋出了[《C++反射機制:可變引數模板實現C++反射》](https://www.cnblogs.com/bwar/p/9304261.html),文章非常實用,Bwar也見過好幾個看了那篇文章後以同樣方法實現反射的專案,也見過不少從我的文章抄過去連程式碼風格類名函式

迪傑斯特拉/dijkstra 算法模板具體凝視

定義 ostream all popu post 路徑 ret typedef tdi #include <iostream> #include <malloc.h> #include <cstring> #include &l

Drupal 7模板主題鉤子的建議

tar 建議 dsm content targe end 鏈接 length down 這一塊的內容很多其它的講的是樣例。所以這裏請直接穩步官方站點查看吧。鏈接 https://drupal.org/node/1089656

搜索模板DFS/BFS

個數 while d+ nod div ++ int second code DFS int b[4][2] = {-1,0,0,1,1,0,0,-1}; int DFS( pair<int,int> x ) { int res=0; vis

常用模板持續更新

ati make size one inf 最短路 返回 01背包 方便 總結一下常用的模板,方便自己使用。 1.最大公約數(歐幾裏得)和最小公倍數 1 typedef long long LL; 2 3 LL gcd(LL a,LL b){ 4 r

viewport 模板移動端

css ref capable tle wid 標題 obi init scale <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta content="

項目實施流程和規範模板測試方向

軟件測試 測試管理 項目管理 小強測試品牌 測試幫日記 1. 簡介1.1 編寫背景隨著公司業務的快速發展,技術部面臨的基礎技術研發、客戶系統建設、新產品研發、老舊系統改造等各類建設項目越來越多。但在眾多技術人員參與、並發項目交互的情況下,如何定義和制定項目實施流程和管理規範顯得越來越重要。

Flask:靜態文件&模板0.1

Go chrom 哪裏 emp .com .org 文檔 專業 查看 Windows 10家庭中文版,Python 3.6.4,Flask 1.0.2 前面看了Flask的Quickstart文檔,可是,一直沒有練習裏面的內容,這不,剛剛練習完畢,來寫篇博文記錄一下!

智能指針類模板五十

類模板 智能指針 Qt 智能指針 我們之前在 C++ 的學習中學習了有關智能指針的知識。那麽智能指針的意義是現代 C++ 開發庫中最重要的類模板之一;是 C++ 中自動內存管理的主要手段,它能夠在很大程度上避開內存相關的問題。在 STL 標準庫中的智能指針為 auto_ptr,它的

高精度模板From JCVB

swa eof its arr mat empty print con gcd 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #includ

計算幾何模板點+線段1.0

計算幾何 int cst opera str point col cstring 弧度 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #in

Kruskal 模板Hdu - 1162

模板 out esp hdu printf true double eof kruskal 最小生成樹指的是在圖上面找到權值最小的一棵樹,並且保證圖上所有的點都在這棵樹上。 解決辦法:Kruskal 算法(貪心思想) /** * Fuck you. * I lov

noip模板復習

結構 查找 tarjan 生成樹 數位 update 狀壓 noip 線段 待update 圖論 單源最短路(dij,spfa) 多元最短路(floyd) 最小(大)生成樹(prim kruscal) 歐拉回路 強連通分量(tarjan).縮點

組合數的一些模板好用

一、 ll qpow(ll a,ll b,ll p) { ll ret=1;a%=p; while(b) { if(b&1) ret=ret*a%p; b/=2;a=a*a%p; } return ret; } 二、Lucas ll lucas(ll n,l

簡單約瑟夫環模板C++版

hdu2211 #include <bits/stdc++.h> using namespace std; int t; long long n,k; //函式返回的就是勝利者編號 long long cir(long long n,long long m){ /

Kruskal模板Java版

gym100712F import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Scanner; public class Main{

樹形dp模板Java版

最簡單的樹形dp,樹上最大點權獨立集 import java.util.Scanner; public class Main{ static class Edge{ int v,next; Edge(int v,int next){

樹形dp模板C++版

poj2342 最簡單的樹形dp入門,樹上的最大點權獨立集 #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int N=6e3