构造时直接使用初始化列表 T object { arg1, arg2, ... }; (1) T { arg1, arg2, ... } (2) new T { arg1, arg2, ... } (3) Class { T member { arg1, arg2, ... }; }; (4) Class::Class() : member{arg1, arg2, ...} {... (5) 赋值使用初始化列表 T object = {arg1, arg2, ...}; (6) function…
这次我真的懂了.... 首先C++11引入了右值引用 && ‘&&’这个要连起来看,是一个整体,C++多了一个关键字而已. 不是引用的引用.是船新的一种语法.那有什么用呢? 额,参数的类型又多了一种! void fun(int T) void fun(int& T) void fun(int && T) void fun(int* t) 之前的参数,值传递,引用,指针.现在呢?多了一个叫 “右值引用”的玩意,多了一种参数类型的选择.仅此而已. 那他们…
C++11:基于std::queue和std::mutex构建一个线程安全的队列 C++中的模板std::queue提供了一个队列容器,但这个容器并不是线程安全的,如果在多线程环境下使用队列,它是不能直接拿来用的. 基于它做一个线程安全的队列也并不复杂.基本的原理就是用std::mutext信号量对std::queue进行访问控制,以保证任何一个线程都是独占式访问,下面是完整的代码. /* * threadsafe_queue.h * * Created on: 2016年7月26日 * Aut…
C++14在标准库里添加了一个很有意思的元函数: std::integer_sequence.并且通过它衍生出了一系列的帮助模板: std::make_integer_sequence, std::make_index_sequence, std:: index_sequence_for.在新的黑魔法的加持下,它可以帮助我们完成在编译期间获取了一组编译期整数的工作. 接下来请系好安全带,准备发车,和大家聊聊新的黑魔法:std::make_index_sequence. 1.what's std:…
转自 http://www.hankcs.com/program/cpp/c11-std-function-usage.html function可以将普通函数,lambda表达式和函数对象类统一起来.它们并不是相同的类型,然而通过function模板类,可以转化为相同类型的对象(function对象),从而放入一个map里. 在看Cocos2d-x的范例代码时,随处可见“很奇怪”的语法: static std::function<Layer*()> createFunctions[] = {…
C++11提供的新类型,定义在<initializer_list>头文件中. template< class T > class initializer_list; 先说它的用处吧,然后再详细介绍一下. 首先有了initializer_list之后,对于STL的container的初始化就方便多了,比如以前初始化一个vector需要这样: , , , }; std::vector<int> vec(a, a+sizeof(a)); 或者 std::vector<i…
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <vector> #include <time.h> //: Poly.cpp #include <iostream> #include <initializer_list> using…
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 让我们先从std::make_unique和std::make_shared的对比开始吧.std::make_shared是C++11的部分,但是,不幸的是,std::make_unique不是.它是在C++14中才被加入到标准库的.如果你使用的是C++11,不要怕,因为一个std::make_unique的基础版本很容易写.看这里: template<typen…
initializer_list 列表初始化 用花括号初始化器列表初始化一个对象,其中对应构造函数接受一个 std::initializer_list 参数. #include <iostream> #include <vector> #include <initializer_list> template <class T> struct S { std::vector<T> v; S(std::initializer_list<T>…
1. 初始化列表的实现 (1)当编译器看到{t1,t2…tn}时便会生成一个initializer_list<T>对象(其中的T为元素的类型),它关联到一个array<T,n>. (2)对于聚合类型,编译器会将array<T,n>内的元素逐一分解并赋值给被初始化的对象.这相当于为该对象每个字段分别赋值. (3)对于非聚合类型.如果该类存在一个接受initializer_list<T>类型的构造函数,则初始化时会将initializer_list<T&g…