zoukankan      html  css  js  c++  java
  • C++ 17

    C++17增加了数十项新特性,值得关注的特性大概有下面这些:

    constexpr if
    constexpr lambda
    fold expression
    void_t
    structured binding
    std::apply, std::invoke
    string_view
    parallel STL
    inline variable

    1、fold expression
    C++11增加了一个新特性可变模版参数(variadic template),它可以接受任意个模版参数在参数包中,参数包是三个点…,它不能直接展开,需要通过一些特殊的方法才能展开,导致在使用的时候有点难度。现在C++17解决了这个问题,让参数包的展开变得容易了,Fold expression就是方便展开参数包的。
    fold expression有4种语义:

    unary right fold (pack op …)
    unary left fold (… op pack)
    binary right fold (pack op … op init)
    binary left fold (init op … op pack)
    其中pack代表变参,比如args,op代表操作符,fold expression支持32种操作符:

    + - * / % ^ & | = < > << >> += -= *= /= %= ^= &= |= <<= >>= == != <= >= && || , .* ->*

    1.2、unary right fold

    1.3、unary left fold

    1.4、binary fold

    1.5、comma fold

    2、constexpr if
    constexpr标记一个表达式或一个函数的返回结果是编译期常量,它保证函数会在编译期执行。相比模版来说,实现编译期循环或递归,C++17中的constexpr if会让代码变得更简洁易懂。
    template<int N>
    constexpr int sum()
    {
    return N;
    }

    template <int N, int N2, int... Ns>
    constexpr int sum()
    {
    return N + sum<N2, Ns...>();
    }

    C++17之前你可能需要像上面这样写,但是现在你可以写更简洁的代码了。

    template <int N, int... Ns>
    constexpr auto sum17()
    {
    if constexpr (sizeof...(Ns) == 0)
    return N;
    else
    return N + sum17<Ns...>();
    }

    3、constexpr lambda
    constexpr lambda其实很简单,它的意思就是可以在constexpr 函数中用lambda表达式了,这在C++17之前是不允许的。这样使用constexpr函数和普通函数没多大区别了,使用起来非常舒服。下面是constexpr lambda的例子:

    template <typename I>
    constexpr auto func(I i) {
    //use a lambda in constexpr context
    return [i](auto j){ return i + j; };
    }

    4、string_view
    string_view的基本用法

    C++17中的string_view是一个char数据的视图或者说引用,它并不拥有该数据,是为了避免拷贝,因此使用string_view可以用来做性能优化。你应该用string_view来代替const char和const string了。string_view的方法和string类似,用法很简单:

    const char* data = "test";
    std::string_view str1(data, 4);
    std::cout<<str1.length()<<' '; //4
    if(data==str1)
    std::cout<<"ok"<<' ';

    const std::string str2 = "test";
    std::string_view str3(str2, str2.size());
    构造string_view的时候用char*和长度来构造,这个长度可以自由确定,它表示string_view希望引用的字符串的长度。因为它只是引用其他字符串,所以它不会分配内存,不会像string那样容易产生临时变量。

    5、

  • 相关阅读:
    Jmeter 设置中文
    不同JDK版本直接的intern()方法的区别---JDK6 VS JDK6+
    java内存模型中堆和栈的区别
    JVM三大性能调优参数 -Xms -Xmx -Xss的含义
    Class<?>中isAssignableFrom()方法与instanceof关键字
    Lua中ipairs 和 pairs的区别
    Redis主从同步中的repl_backlog_buffer和repl_buffer
    Redis-开启使用AOF日志
    将windows 文件复制到linux上去
    winform集成第三方应用引起灾难性崩溃处理
  • 原文地址:https://www.cnblogs.com/shuang0109/p/9828992.html
Copyright © 2011-2022 走看看