0
点赞
收藏
分享

微信扫一扫

C++14新特性小记

登高且赋 2022-01-15 阅读 49

C++14新特性小记

1. 变量模板

template<typename T>
constexpr T pi = static_cast<T>(3.1415926535897932385L);

int main(int argc, char** argv) {
    cout << pi<int> << endl;	// 3
    cout << pi<float> << endl;	// 3.14159
    cout << pi<double> << endl;	// 3.14159
    return 0;
}

2. 泛型lambda表达式

int main(int argc, char** argv) {
    auto f1 = [](int x) { return x + 3.14; };
    auto f2 = [](auto x) { return x + 3.14; }; // c++11:error
    
    cout << f1(1) << endl;	// 4
    cout << f2(2) << endl;	// 5.14
    return 0;
}

3. constexpr 函数上放松的限制

constexpr int f1(int n) {
    return n < 1 ? 0 : (n + f1(n-1)); 
}

// c++11 : error
// C++11 constexpr 函数必须把一切放在单条 return 语句中
// (C++14 无此要求)
constexpr int f2(int n) {
    int res = 0;
    for (int i = 1; i <= n; ++i) {
        res += i;
    }
    return res;
}

int main(int argc, char** argv) {
    cout << f1(10) << endl;	// 55
    cout << f2(10) << endl;	// 55
    return 0;
}

4. 二进制字面量与整形字面量分隔符

int a = 0b1001;
double b = 3.14'1592'6535;

使用'做分隔符,便于阅读。

5. 函数返回值类型推导

template<typename T>
auto f(T i) { return i; }

int main(int argc, char** argv) {
    cout << f<double>(7.3) << endl;
    return 0;
}

6. make_unique

为unique_ptr指针提供

struct A {};
unique_ptr<A> ptr = make_unique<A>();

7. shared_timed_mutex与 shared_lock

shared_timed_mutex 类是能用于保护数据免受多个线程同时访问的同步原语。

  • 共享 - 多个线程能共享同一互斥的所有权。

  • 排他性 - 仅一个线程能占有互斥。

shared_lock 是通用共享互斥所有权包装器,允许延迟锁定、定时锁定和锁所有权的转移。

8. integer_sequence

template<typename T, T... ints>
void print_sequence(integer_sequence<T, ints...> int_seq)
{
    cout << "The sequence of size " << int_seq.size() << ": ";
    ((cout << ints << ' '), ...);
    cout << endl;
}

int main() {
    print_sequence(integer_sequence<int, 9, 2, 5, 1, 9, 1, 6>{});
    return 0;
}
// The sequence of size 7: 9 2 5 1 9 1 6

9. exchage

int main(int argc, char** argv) {
    vector<int> v;
    exchange(v, {1, 2, 3, 4});
    cout << v.size() << endl;
    // 4

    for (int &a : v) cout << a << " ";
    cout << endl;
    // 1 2 3 4
    
    return 0;
}

可能的实现

template<class T, class U = T>
constexpr T exchange(T& obj, U&& new_value) {
    T old_value = std::move(obj);
    obj = std::forward<U>(new_value);
    return old_value;
}

10. quoted

int main(int argc, char** argv) {
    string str = "helo world";
    cout << str << endl;
    cout << quoted(str) << endl;
    return 0;
}
// helo world
// "helo world"
举报

相关推荐

0 条评论