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"