c++11變長參數函數模板

By francis_hao    Mar 25,2018 html

 

一個最簡單的實例大概是這個樣子: python

#include <iostream>
using namespace std;

/*
變長參數函數模板聲明*/
template <typename... T>
void print(T... val);

/*
邊界條件*/
void print(void)
{
    cout<<"here end"<<endl;
}

/*
遞歸的特例化定義*/
template <typename T1, typename... T2>
void print(T1 start, T2... var)
{
    cout<<"sizeof ... now is: "<<sizeof... (var)<<endl;
    cout<<start<<endl;
    print(var...);
}


int main(void)
{
    print(1,2,3,4);
    return 0;
}
ios

其中的聲明實際上是沒什麼用的,只是告訴使用者能夠按照這樣的格式使用,若是不作這個聲明,只保留"邊界條件"和"遞歸的特例化定義",這樣雖然可行,可是未免會形成困惑。 函數

 

執行結果以下: spa

 

實際上,這個"變長"付出的代價仍是很大的,要遞歸的實例出n個函數,最終再調用邊界條件的函數。過程以下 htm

 

以上可見,這個變長參數函數模板實現的一點也不"優雅",有點強行打補丁的感受。看看"別人家的孩子"在這個問題上是怎麼作的呢?以python爲例,沒有對比就沒有傷害~ blog

def printf(*arg):
    for val in arg:
        print(val)

if "__main__" == __name__:
    printf(1,2,3,4)
遞歸

 

 


本文由 劉英皓 創做,採用 知識共享署名-非商業性使用-相同方式共享3.0中國大陸許可協議 進行許可。歡迎轉載,請註明出處:
轉載自:http://www.cnblogs.com/yinghao1991/p/8644943.html ci

 

 

參考

【1】Michael Wong,IBM XL編譯器中國開發團隊 著 深刻理解C++11:C++11新特性解析與應用 機械工業出版社:北京,2013.6 開發

相關文章
相關標籤/搜索