用C 可變引數模板實現類似C語言的printf

2021-08-09 15:45:05 字數 818 閱讀 2589

在以前,c++要實現可變引數的函式,得用c語言的va_list那一套東西,直到c++11的可變引數模板誕生,正好最近在寫乙個日誌模組,是時候了解一下可變引數模板了。

下面這個簡單的log函式,只使用##進行佔位,並沒有區分型別,有點像c#的、……

#include #include #include templatevoid mylog(const std::string& format, const args&... args) 

templatevoid mylog(std::string& format, const next& next, const other&... other)

else

}void mylog(std::string& format)

int main()

執行結果:

可以看到,一共有三個版本的mylog函式,前兩個都是模板函式,第乙個函式用來將const的格式化字串簡單地轉換為非const形式的呼叫,第二個函式則是核心,用某種規則進行遞迴,第三個函式則是遞迴出口。

要注意的是:

1. args...可以是任意數量個引數,包括0個。

2. args...形式的引數包只能通過遞迴的方式解開。

3. 用sizeof...(args)可以得到此引數包的引數個數。

4. 巨集替換有效:#define debug(format, ...) mylog(format, ##__va_args__)。

C 11 可變引數模板實現print輸出引數

c 11支援可變引數模板的特性,真的是很好用。下面 實現的print函式,就利用可變引數模板以及函式模板遞迴呼叫,實現將任意多個不同型別的引數順序輸出列印到std ostream流中。include 終止遞迴函式 inline void args print std ostream steam 使用...

C 可變引數模板

c 可變引數模板 flyfish c 98版本不支援 c 11版本以上支援 arguments 是引數包 parameter pack 類 classname 可以接受可變引數個數 template class custom tuple custom tuple c1 custom tuple c2...

c 可變引數模板

可變模板引數函式 1.逗號表示式展開引數包 templatevoid expand const f f,args.args expand auto i 1,2.0,test 2.遞迴函式方式展開 template void printarg t t 終止遞迴 templatevoid process...