美文网首页
超好用的C++11新特性(二)

超好用的C++11新特性(二)

作者: 小腊鸡 | 来源:发表于2020-05-03 09:32 被阅读0次

    在上一篇文章中,我们讲到了nullptr、auto、decltype、for,得益于这些新特性,我们写出的程序更加安全、简洁。如果你还不了解,请移步至超好用的C++11新特性(一)。今天,我们将继续讲解C++11新特性。

    1.编译期常量

    在C++里用关键字const可以定义常量,例如:

    const int k=1024;     // 整数常量,值为1024
    

    但这样的“常量”实际上是运行时不可修改的“常量”,在泛型编程里有时会需要在编译期可用的“真正的”常量。于是C++11/14增加了新关键字constexpr,它相当于编译期的const,但功能更强,可以让编译器更好地优化代码,例如:

    constexpr int kk=1024;
    

    2.类型别名

    在原本的C++98标准中,你能用到关键字using的地方估计只有using namespace std;了。但是在C++11/14里扩展了using关键字的能力,可以完成与typedef相同的工作(为类型取一个别名)。例如:

    using int64=long;          // long类型的别名是int64
    using llong=long long;     // long long类型的别名是llong
    

    这种类似于赋值的语句,使我们更加容易阅读和理解。但实际上using的能力远不止于此,它还可以结合template关键字为模板类声明“部分特化”的别名。例如:

    template<typename T>
    using int_map = std::map<int,T>;    // 固定key类型为int
    int_map<std::string> m;             // 使用别名,省略了一个模板参数
    

    3.可变参数模板

    C/C++的函数支持可变参数,允许函数接收任意数量的参数,最典型的就是printf()

    int printf(const char *format, ...);
    

    为了更好地支持编译器的模板元编程,C++11/14标准引入了与之类似的特性。语法十分相近,同样使用了省略号“...”来声明不确定数量的参数。例如:

    template<typename ... T> void some_func(){};
    

    在传入不确定个数的参数之后,我们需要对参数包进行展开,展开的方式多种多样:递归、逗号表达式、模板偏特化、继承。由于篇幅限制,在这里我就只举一个递归的例子:

    template<typename T,typename... Args>
    void print(T head,Args... args)       // 展开函数
    {
        std::cout<<head<<std::endl;       // 打印一个参数
        print(args);                      // 递归打印
    }
    
    template<class T>
    void print(T t)                       // 递归终止函数
    {
        std::cout<<t<<std::endl;
    }
    

    这样,上面的两个print()函数基本就被封装成了万能打印函数。

    结语

    下面还会继续讲解C++11的新特性,喜欢的朋友请点个赞吧!

    相关文章

      网友评论

          本文标题:超好用的C++11新特性(二)

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