昨天研究了一天的宏,最后的结论还是无法和模板一起使用!!! 特性十里的代码我更新一下:
#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;
}
从目前来看,递归的规则和递归终止条件必须写成两个函数,而且是重载的形式。
基于这种规则,我们可以写一些有意思的代码,比如如何获得不定长参数模板的调用的时候的参数个数? 代码如下:
#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;
}
输出结果:
7
上篇文章中我提到过 apply 这个东西,这个东西其实就是使用类似列表的东西,给函数传参,什么意思,比如我有一个函数形如:
int func(int, string);
我使用如下的调用方法:
apply(func, list(1, "abc"));
这个东西C++17里面已经提供了,不过使用的不是list,而是tuple。实用性吗,我就呵呵了!!!我研究了两天,发现这玩意不能和模板配合使用,简单的说 func 不是是模板函数,或者你想了,我要是使用函数对象封装这个模板函数不就行了,那你想多了,也不行,不过我测试的模板函数都是不定长参数,对于定长参数模板我没有实验!!!总之,不好用!
新特性到这里基本就结束了,其他的特性都是常规话的特性,不过我很多东西都没有说到,比如,tuple的实现?bind函数的实现?forward的实现及其应用?move的实现等等?这些有兴趣就自己看看吧!
C++11 还有一些库扩展,比如线程库,随机函数库,正则表达式库等等?不过我想要的什么json库,xml库,网络库,还没有提供。。。
还有什么哈希容器,初始化列表等等,初始化列表可以看看非常的方便!!!不过这些东西,相对来说理解比较简单。