C 11中的變參模板的使用

2021-07-26 03:50:18 字數 1288 閱讀 3451

在新的c++11標準裡提供了變參模板,這個類似於在c語言裡的printf這個列印函式,引數可以是隨機的。當時記得在寫嵌入式底層的時候兒需要實現乙個類似於printf的函式,還使用var_start,var_end等實現了它。但是從c++0x其實大家都呼籲模板中也提供類似的功能,現在終於有了。

c++11中提供的這個變參模板,可以說功能更強大了,而且應用靈活。可以實現一些原來比較複雜的技術,讓其簡單明晰化。嘮叼了一些,開始扯正題,先看乙個簡單的實現:

#include

templatevoid print(t t)//當引數個數等於1是,進入此函式

//當引數個數大於1是,進入此函式

templatevoid print(t t, args ... args)  {

print(args...);  

int main(int argc, char* argv)

print(101,『d』, 1, 3.0, "name");

這裡有乙個函式,可以提供對可變引數的的數量多少提供支援:sizeof...這個函式,注意,後面是有三個小點點的,不是多寫了,使用的方法如下:

sizeof...(args))...

通過上面的的簡單例項可以發現,這個模板使用的是遞迴呼叫自己來實現的,如果需要處理多個引數的關係,這個就得借助其它的方式了,比如:

std::tuple

可以這樣使用:

std::tuple_args;

auto curargs = std::make_tuple(args...);

_args =curargs;                

然後再通過具體的方法來處理。

但是如果只是單純的這樣使用,確實是有點矯揉造作的嫌疑,其實其更強大的用法如下:

template

autotest(f&& f, args&&... args) ->void {

auto curargs = std::make_tuple(args...);

lock();

for(auto &cur:_instance)

//使用std::bind去繫結具體物件,並調該物件的方法

//注意,如果沒有類物件,則可以不要_cur

std::bind(f,_cur, args...)();

unlock();

看到了這種方式,是不是可以推而廣之,諸如訊息監聽,事件鏈,推送,包括設計模式中的觀察者模式都可以使用類似的方法。既簡單又清晰明了。

所以說,技術的進步,就是為了解決以前的複雜的問題。

緊緊咬住技術的前沿,才能把技術做得更好。

C 11 模板的改進

在c 98 03的泛型程式設計中,模板例項化有乙個很繁瑣的地方,就是連續兩個右尖括號 會被編譯解釋成右移操作符,而不是模板參數列的形式,需要乙個空格進行分割,以避免發生編譯時的錯誤。template class x template class y int main 在例項化模板時會出現連續兩個右尖...

c 11模板的特化

前面定義的stack中,第二個模板引數要求支援back,push back,pop back等介面。如果我們已經有乙個自定義的容器array,它的定義如下 template struct array array只有put和get介面,並輔助以index引數進行元素訪問。為了讓array也能參與實現s...

c 11中using的使用

這種用法估計使用最多的,為了防止定義變數名 函式名衝突,把它們定義在乙個命名空間內,使用的時候需要進行命名空間的申明 using namespace std 就不過多講解。using 還可以指定別名,比如using so3d so3 那麼它和typedef 有什麼區別?template int op...