如何寫乙個可接受任意數量引數的函式

2021-09-25 16:44:36 字數 1972 閱讀 9365

在 c++11之前,編寫帶有任意數量引數的函式的唯一方法是使用可變引數函式,最有名的要數 c runtime library 的 printf (...)。

如果您曾經使用這種方法編寫過**,你就會知道這種方法有多麼麻煩。 除了型別不安全之外,還需要糾正一些錯誤。而且,每次使用都要小心翼翼,說不定**就出錯了。所以,下面給大家介紹乙個超cool的東西,可變引數模板。

直接來看個例子,最經典的就是乙個add函式的實現了,它將所有引數加在一起:

template t  add(t value)

template t add(t head, ts... rest)

當你寫下如下的兩個呼叫時:

auto test1 = add(1,2,3,4,5);

auto test2 = add("what's"s, " up"s, "!"s);

std::cout << test1 << std::endl;

std::cout << test2 << std::endl;

它會輸出:

what's up!

這看起來很像遞迴不是嗎。其實不是,來看下為什麼。

當你寫下這樣的函式的時候,編譯器會為你生成以下函式:

template<>

int add(int head, int __rest1, int __rest2, int __rest3,

int __rest4)

template<>

int add(int head, int __rest1, int __rest2, int __rest3)

template<>

int add(int head, int __rest1, int __rest2)

template<>

int add(int head, int __rest1)

template<>

int add(int value)

當你在你的程式呼叫add函式時,在編譯階段,編譯器會為你生成每個呼叫對應的函式,包括引數的個數和型別。其實上面的結果告訴我們,是函式過載在起作用。注意了哦,是函式過載,可不是遞迴。雖然在上面的例子它很好的執行了,並且給出了我們預期的結果。但是,假如我們變化一下呼叫的方式呢?

add("what's"s, ' ', "up!"s);
上面的例子中,我們在中間加了乙個char型別的 '  ',因為std::string是允許我們將乙個char + std::string或者std::string + char這樣的呼叫的,我們可以將乙個char型別字元的拼接到乙個string型別的字串,形成乙個更長的字串。所以我們這樣應該也是可以的。但是當我寫下這樣的**,按下f5,編譯器卻報給了我乙個錯誤。下面是報錯截圖:

發生了什麼呢?再看一下我們編譯器為我們特化的函式,要注意到,每個函式的返回型別,t,都是和第乙個引數的型別相同,所以當我特化到add(char, std::string)的時候,它的返回型別是char,但是實際上我們的函式內部返回的卻是乙個string型別的東西,這樣就會造成返回型別不匹配。怎麼解決呢?

還記得我們的auto嗎?哈哈,這個好東西又派上用場了,我們需要將我們的add函式返回型別宣告的auto,這樣,編譯器就會自動推導出乙個正確的返回型別。

template auto  add(t value)

template auto add(t head, ts... rest)

這樣,當你再這樣呼叫的時候:

add("what's"s, ' ', "up!"s);
it works!

請寫乙個php函式,可以接受任意數量的引數

請寫乙個php函式,可以接受任意數量的引數 這是一道面試題。怎麼寫這個函式呢?function fun 解決方案 php code function show params 沒有引數,什麼都不輸出 echo foo 輸入 hello world echo foo hello world 輸出 arg...

如何寫乙個Stack?

1.棧是陣列 2.先進後出 3.出棧 4.入棧 手寫乙個雙向鍊錶 棧 public class stackpopandpush public stackpopandpush int lens 返回元素個數 public intsize 返回陣列長度,容量,棧資料長 private intcapaci...

如何寫乙個鍊錶

有的時候,處於記憶體中的資料並不是連續的。那麼這時候,我們就需要在 資料結構中新增乙個屬性,這個屬性會記錄下面乙個資料的位址。有了這個位址之後,所有的資料就像一條鍊子一樣串起來了,那麼這個位址屬性就起到了穿線鏈結的作用。相比較普通的線性結構,鍊錶結構的優勢是什麼呢?我們可以總結一下 1 單個節點建立...