美文网首页
C++11 新特性(十一)

C++11 新特性(十一)

作者: IT孤独者 | 来源:发表于2018-09-19 19:32 被阅读0次

昨天研究了一天的宏,最后的结论还是无法和模板一起使用!!! 特性十里的代码我更新一下:

#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库,网络库,还没有提供。。。

还有什么哈希容器,初始化列表等等,初始化列表可以看看非常的方便!!!不过这些东西,相对来说理解比较简单。

相关文章

网友评论

      本文标题:C++11 新特性(十一)

      本文链接:https://www.haomeiwen.com/subject/foqwnftx.html