美文网首页
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