
C++11
metarun
这个作者很懒,什么都没留下…
展开
-
c++11 thread
thread创建: void func(int i) { cout << "func" << endl; } thread t(func, 1); t.join(); 注意我们应该保证线程对象的生命周期在线程函数执行完时仍然存在。 get_id获取当前线程id,hardware_concurrency获取cpu核心数,sleep_for让当前的线程休眠一定时间 ...原创 2020-05-19 10:42:01 · 138 阅读 · 0 评论 -
c++11 std::shared_ptr std::uniq_ptr std::weak_ptr
std::shared_ptr共享的智能指针,内部使用了引用计数,当引用计数为0的时候,内存就会被释放。 智能指针的初始化: std::shared_ptr<int> p(new int(1)); std::shared_ptr<int> p2 = p; std::shared_ptr<int> ptr; ptr.reset(new int(2)); if (ptr) { cout << "...原创 2020-05-18 18:16:32 · 268 阅读 · 0 评论 -
c++11 可变参数模板类
可变参数模板类,如元组: template<class... Args> class tuple; 递归和特化的方式展开参数包 //可变参数模板类前向声明 template<typename... Args> struct Sum; //定义展开参数的可变参数模板类 template<typename First, typename... Rest> struct Sum<First, Rest...> { enum{ value = S...原创 2020-05-13 11:46:06 · 487 阅读 · 0 评论 -
c++11 可变参数模板
打印可变参数的个数: template<class...Args> void f(Args... args) { cout << sizeof...(args) << endl; } f(1); //1 f(1, 1.2); //2 f(1, 'c', 2); //3 递归展开参数包: template<typename T> void print(T t) ...原创 2020-05-13 11:05:45 · 167 阅读 · 0 评论 -
c++11 其它的转换的traits
template<bool B, class T, class F> struct conditional; 如果B为true,则conditional::type为T,否则为F。 typedef conditional<(sizeof(long long) > sizeof(long double)), long long, long double...原创 2020-05-11 11:52:01 · 102 阅读 · 0 评论 -
c++11 std::enable_if
c++11 std::enable_if原型如下: template<bool B, class T = void> struct enable_if; 在判断条件B为true时才有效,默认类型为void。它可以在编译期检查模板输入参数是否有效。原创 2020-05-11 11:50:01 · 385 阅读 · 0 评论 -
c++11 类型的转换的traits
template<class T> struct remove_const; 移除const template<class T> struct add_const; 添加const template<class T> struct remove_reference; 移除引用 template<class T> struct...原创 2020-05-08 11:27:19 · 227 阅读 · 0 评论 -
c++11 常用判断类型的traits
template<class T> struct is_void; T是否为void类型 template<class T> struct is_enum; T是否为枚举类型 template<class T> struct is_union; T是否为union类型 template<class T> struct is_...原创 2020-05-08 11:05:24 · 496 阅读 · 0 评论 -
c++11 编译期常量定义
在c++11之前,在类中定义编译期常量的方法: template<typename Type> struct Size { static const int x = 1; }; template<typename Type> struct Size { enum{ x = 1, y = 2 }; }; 在c++11中定义编译期常量,无须定义static...原创 2020-05-08 10:34:37 · 1144 阅读 · 0 评论 -
c++11 std::forward
在函数模板中,需要完全依照模板的参数类型(即保持参数的左值、右值特征),将参数传递给函数模板中调用的另外一个函数。c++11提供了这样的一个函数std::forward,不管参数是T&&这种未定的引用,还是明确的左值引用或右值引用,它会按照参数本来的类型转发。 forward会把左值传递给右值。 struct A { int value; explicit A(...原创 2020-05-06 14:38:46 · 778 阅读 · 0 评论 -
c++11 std::move
std::move方法将左值转换为右值,方便实现移动构造。当一个对象内部有很大的堆内存或者动态数组时,有必要写move语义的拷贝构造函数和赋值函数,避免无谓的深拷贝,以提高性能。c++中所有的容器都实现了move语义,方便性能优化。 move对于拥有内存、文件句柄等资源的成员的对象有效,对于基本类型,如int和char[10]数组等,如果使用move,任然会发生拷贝。 ...原创 2020-05-06 13:56:12 · 229 阅读 · 0 评论 -
c++11 右值引用
右值引用标记为T&&,在介绍右值引用前先了解什么是左值和右值。 左值是指表达式结束后依然存在的持久对象,右值是指表达式结束时不再存在的临时对象。区分左右值,看能不能对表达式取地址,能取,是左值,不能取,是右值。所有具名变量或对象都是左值,而右值不具名。 c++11中右值两个概念,一个将亡值,另一个纯右值。非引用返回的临时变量、表达式产生的临时对象、原始字面量和lambda表达式...原创 2020-05-06 13:43:38 · 157 阅读 · 0 评论 -
c++11 tupe
tupe元组是一个固定大小的不同类型值的集合,是泛化的std::pair,可以把它当结构体使用。 构造一个元组: tuple<const char*, int> tp = make_tuple("sendpack", 8); 或 int i = 1; auto tp = std::tie(i, "aa"); 相当于: struct tp { char* p; ...原创 2020-05-06 11:27:43 · 818 阅读 · 0 评论 -
c++11 lambda表达式
lambda表达式定义了一个匿名函数,并且可以捕获一定范围内的变量。 形如:[capture](params) opt->ret{body;} capture是捕获列表,params是参数列表,opt是函数选项,如mutable,ret是函数返回值类型,body是函数体 []不捕获任何变量 [&]按引用捕获作用域中的所有变量 [=]按值捕获作用域中的所有变量 [=,&am...原创 2020-05-06 10:29:13 · 130 阅读 · 0 评论 -
c++11 std::bind
std::bind将可调用对象与其参数一起进行绑定。绑定后的结果可以使用std::function进行保存。原创 2020-05-01 21:45:42 · 112 阅读 · 0 评论 -
c++11 std::function
c++可调用对象的几种定义 1.是一个函数指针 2.是一个具有operator()成员函数的类对象(仿函数) 3.是一个可被转换为函数指针的类对象 4.是一个类成员变量指针 5.是一个类成员函数指针 void func() {} struct Foo { void operator () (void){ } }; struct Foo2 { using cb...原创 2020-04-30 18:33:03 · 317 阅读 · 0 评论 -
c++11 基于范围的for循环
基于范围的for循环auto自动推导出的类型是容器中的value_type,而不是迭代器 新的for循环,冒号后面的表达式只会执行一次 std::vector<int> arr = { 1, 2, 3, 4, 5 }; std::vector<int>& get_range() { std::cout << "get_range" <&...原创 2020-04-30 12:39:37 · 140 阅读 · 0 评论 -
c++11 列表初始化
c++11中,初始化列表的使用范围被大大增强了。 首先看看聚合类型定义: 1.类型是一个普通数组(如int[3]) 2.类型是一个类(class、struct、union)且 无用户自定义的构造函数 无私有或保护的非静态数据成员 无基类 无虚函数 自定义的构造函数: struct B { int x; int y; B(int, int) ...原创 2020-04-30 08:26:08 · 215 阅读 · 0 评论 -
c++11 using
using用来定义类型别名,覆盖了typedef的所有功能 using uint = unsinged int;原创 2020-04-24 17:36:07 · 101 阅读 · 0 评论 -
c++11 decltype
auto修饰的变量必须被初始化,编译器需要通过初始化来确定auto所代表的类型,而decltype修饰的变量不需要初始化,用来在编译时推导出一个表达式的类型。decltype推导的结果保留表达式的所有属性(cv(const和volatile限定符的统称)、引用) auto推导左值表达式时,会带引用,推导右值表达式时,不带引用。 struct Foo { int x; }; const...原创 2020-04-24 17:31:21 · 93 阅读 · 0 评论 -
c++11 auto
auto是类型推导关键字,两条推导规则: int m = 0; const auto e = m; //e -> const int auto f = e; //f -> int const auto& g = m; //g -> const int& auto&a...原创 2020-04-24 13:12:09 · 148 阅读 · 0 评论