昨天研究了一天的宏,最后的結(jié)論還是無法和模板一起使用^人堋!枫疆! 特性十里的代碼我更新一下:
#include <iostream>
using namespace std;
template <typename T>
auto sum(T first) {
return first;
}
template <typename T1, typename... T2>
auto sum(T1 first, T2... rest) {
return first + sum(rest...);
}
int main() {
std::cout << sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) << std::endl;
return 0;
}
從目前來看爵川,遞歸的規(guī)則和遞歸終止條件必須寫成兩個函數(shù)敷鸦,而且是重載的形式息楔。
基于這種規(guī)則,我們可以寫一些有意思的代碼扒披,比如如何獲得不定長參數(shù)模板的調(diào)用的時候的參數(shù)個數(shù)值依? 代碼如下:
#include <iostream>
using namespace std;
int len() {
return 0;
}
template <typename T1, typename... T2>
int len(T1 first, T2... rest) {
return 1 + len(rest...);
}
int main() {
std::cout << len(1, 2, 3, 4, 5, "abc", "def") << std::endl;
return 0;
}
輸出結(jié)果:
7
上篇文章中我提到過 apply 這個東西,這個東西其實就是使用類似列表的東西碟案,給函數(shù)傳參愿险,什么意思,比如我有一個函數(shù)形如:
int func(int, string);
我使用如下的調(diào)用方法:
apply(func, list(1, "abc"));
這個東西C++17里面已經(jīng)提供了价说,不過使用的不是list辆亏,而是tuple。實用性嗎鳖目,我就呵呵了0邕丁!领迈!我研究了兩天彻磁,發(fā)現(xiàn)這玩意不能和模板配合使用,簡單的說 func 不是是模板函數(shù)狸捅,或者你想了衷蜓,我要是使用函數(shù)對象封裝這個模板函數(shù)不就行了,那你想多了尘喝,也不行磁浇,不過我測試的模板函數(shù)都是不定長參數(shù),對于定長參數(shù)模板我沒有實驗P嗤省V孟拧鳍贾!總之,不好用交洗!
新特性到這里基本就結(jié)束了骑科,其他的特性都是常規(guī)話的特性,不過我很多東西都沒有說到构拳,比如咆爽,tuple的實現(xiàn)?bind函數(shù)的實現(xiàn)置森?forward的實現(xiàn)及其應(yīng)用斗埂?move的實現(xiàn)等等?這些有興趣就自己看看吧凫海!
C++11 還有一些庫擴(kuò)展呛凶,比如線程庫,隨機(jī)函數(shù)庫行贪,正則表達(dá)式庫等等漾稀?不過我想要的什么json庫,xml庫建瘫,網(wǎng)絡(luò)庫崭捍,還沒有提供。啰脚。殷蛇。
還有什么哈希容器,初始化列表等等橄浓,初始化列表可以看看非常的方便AC巍!荸实!不過這些東西匀们,相對來說理解比較簡單。