c++11::std::remove_reference】的更多相关文章

引用移除 : remove_reference 引用折叠规则 A& & 折叠成 A&  A& && 折叠成 A&  A&& & 折叠成 A&  A&& && 折叠成 A&&…
下文先从C++11引入的几个规则,如引用折叠.右值引用的特殊类型推断规则.static_cast的扩展功能说起,然后通过例子解析std::move和std::forward的推导解析过程,说明std::move和std::forward本质就是一个转换函数,std::move执行到右值的无条件转换,std::forward执行到右值的有条件转换,在参数都是右值时,二者就是等价的.其实std::move和std::forward就是在C++11基本规则之上封装的语法糖. 1 引入的新规则 规则1(…
[std::remove_reference] 用于移除类型的引用,返回原始类型. 1.可能的实现. 2.例子. #include <iostream> // std::cout #include <type_traits> // std::is_same template<class T1, class T2> void print_is_same() { std::cout << std::is_same<T1, T2>() <<…
转自 http://www.hankcs.com/program/cpp/c11-std-function-usage.html function可以将普通函数,lambda表达式和函数对象类统一起来.它们并不是相同的类型,然而通过function模板类,可以转化为相同类型的对象(function对象),从而放入一个map里. 在看Cocos2d-x的范例代码时,随处可见“很奇怪”的语法: static std::function<Layer*()> createFunctions[] = {…
这个函数并不是简单的 while(first != last) { *result = *first; result++; first++; } 事实上这种写法是最具普适性的,值要求inputIterator是输入迭代器,outputIterator是输出迭代器 可以想像我们熟悉的链表,vector之类的迭代器都是满足要求的.但这种最具普适性的写法性能却不咋地. 习惯C语言的应该都很喜欢memcpy这个函数,确实高效.在C++里,不是所有的对象拷贝都能简单的memcpy的, c++11给出了一个…
C++本身有引用(&),为什么C++11又引入了std::ref(或者std::cref)? 主要是考虑函数式编程(如std::bind)在使用时,是对参数直接拷贝,而不是引用.如下例子: #include <functional> #include <iostream> void f(int& n1, int& n2, const int& n3) { std::cout << "In function: " <…
C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢导致程序出现未定义的行为.通常的做法是在修改共享数据成员的时候进行加锁--mutex.在使用锁的时候通常是在对共享数据进行修改之前进行lock操作,在写完之后再进行unlock操作,进场会出现由于疏忽导致由于lock之后在离开共享成员操作区域时忘记unlock,导致死锁. 针对以上的问题,C++11中引入了std::unique_lock与std::lock_guard两种数据结构.通过对lock和…
最近看代码,智能指针用的比较多,自己平时用的少,周末自己总结总结.方便后续使用. std::shared_ptr大概总结有以下几点: (1) 智能指针主要的用途就是方便资源的管理,自动释放没有指针引用的资源. (2) 使用引用计数来标识是否有多余指针指向该资源.(注意,shart_ptr本身指针会占1个引用) (3) 在赋值操作中, 原来资源的引用计数会减一,新指向的资源引用计数会加一. std::shared_ptr<Test> p1(new Test); std::shared_ptr&l…
cocos new 出新的项目之后,仔细阅读代码,才发现了一句3.0区别于2.0的代码: auto closeItem = MenuItemImage::create( "CloseNormal.png", "CloseSelected.png", CC_CALLBACK_1(HelloWorld::menuCloseCallback, this)); 2.0内的代码用的不是CC_CALLBACK_1而是menu_selector. CC_CALLBACK系列是3.…
c++11中增加了std::function和std::bind,可更加方便的使用标准库,同时也可方便的进行延时求值. 可调用对象 c++中的可调用对象存在以下几类: (1)函数指针 (2)具有operator()成员函数的类对象(仿函数) (3)可被转换为函数指针的类对象 (4)类成员(函数)指针 void func(void){ //.... } struct Foo{ void operator()(void){ //... } }; struct Bar{ using fr_t = vo…
更好的方式 C++11中提供了操作多线程的高层次特性. std::packaged_task 包装的是一个异步操作,相当与外包任务,好比我大阿里把电话客服外包给某某公司. std::future 提供了一个访问异步操作结果的机制,这个是底层机制,在packaged_task和promise内部都有future来访问结果. 说的比较干巴,还是上代码吧! #include <iostream> #include<vector> #include <future> using…
转载 http://eli.thegreenplace.net/2016/the-promises-and-challenges-of-stdasync-task-based-parallelism-in-c11/ One of the biggest and most impactful changes C++11 heralds is a standardized threading library, along with a documented memory model for the…
参考博客: C++可调用对象详解-https://www.cnblogs.com/Philip-Tell-Truth/p/5814213.html 一.关于std::function与std::bind 翻看了几篇博客,还不如看书逻辑性好.以下内容摘自祁宇<深入应用C++11: 代码优化与工程级应用>一书. 有以下4种情况可被称为可调用对象. 1.是一个函数指针.(这里的函数要求是如C函数一样的编译期内存确定的函数指针) 2.是一个具有operator()成员函数的类对象.(让类重载调用操作符…
decltype ( 实体 ) () (C++ 起) decltype ( 表达式 ) () (C++ 起) 若实参是其他类型为 T 的任何表达式,且 a) 若 表达式 的值类别为亡值,则 decltype 产生 T&&: b) 若 表达式 的值类别为左值,则 decltype 产生 T&: c) 若 表达式 的值类别为纯右值,则 decltype 产生 T. int a; double d; float f; decltype(a) aa; cout << typei…
multiple threads synchronization primitive: 多线程同步语义 多线程的同步语义是多线程编程的核心,线程之间通过同步语义进行通信,实现并发.C++ JAVA 中线程同步的基本原语是condition variable 和mutex构成的管程 ,OS操作系统课程中经常出现的信号量(Semaphore)语义在实际编程中比较少见.我目前工作中只用过mutex+condvar,或者在它们之上的高层抽象,C++11 中的future和promise. 那么C++11…
{ #define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)#define CC_CALLBAC…
简单点理解,c++11 中的std::move() 函数,实际上就是将一个左值强制转换成一个右值引用数据类型,从而可以调用相应的对右值引用重载的函数. 如果使用std::move() 的返回值做为参数来调用一个没有对右值引用做重载的函数时,那么std::move() 函数的返回值就相当 于一个常量值或者是const T& 这样一个对象被传入到函数中.…
所谓的详解只不过是参考www.cplusplus.com的说明整理了一下,因为没发现别人有详细讲解. chrono是一个time library, 源于boost,现在已经是C++标准.话说今年似乎又要出新标准了,好期待啊! 要使用chrono库,需要#include<chrono>,其所有实现均在std::chrono namespace下.注意标准库里面的每个命名空间代表了一个独立的概念.所以下文中的概念均以命名空间的名字表示! chrono是一个模版库,使用简单,功能强大,只需要理解三个…
从最基础的了解,std::bind和std::function /* * File: main.cpp * Author: Vicky.H * Email: eclipser@163.com */ #include <iostream> #include <functional> #include <typeinfo> #include <string.h> int add1(int i, int j, int k) { return i + j + k;…
std::call_once的作用是很简单的, 就是保证函数或者一些代码段在并发或者多线程的情况下,始终只会被执行一次.比如一些init函数,多次调用可能导致各种奇怪问题. 给个例子: #include <iostream> #include <thread> #include <mutex> std::once_flag flag1; void simple_do_once() { std::call_once(flag1, [](){ std::cout <&…
std::move函数可以以非常简单的方式将左值引用转换为右值引用.(左值.左值引用.右值.右值引用 参见:http://www.cnblogs.com/SZxiaochun/p/8017475.html) 通过std::move,可以避免不必要的拷贝操作. std::move是为性能而生. std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝. 如string类在赋值或者拷贝构造函数中会声明char数组来存放数据,然后把原string中的…
auto 定义变量时放在变量前,无需知道具体变量类型,系统可自行推断类型,减少编程工作,特别是在模板使用时,使用更方便. 下面简单例子: auto a=; auto b='a'; auto s="abdc"; auto c;//这样使用时错误的,系统无法自动推断出变量类型 //下面为迭代指针使用,很方便 vector<int> vec; auto it=vec.begin(); 模板使用例子: template<typename InputIterator> T…
std::optional还有一个类似于智能指针的接口, 它可以显式转化为bool来表示std::optional是否有一个值. 指针的解引用操作符*和->都实现了, 但是没有std::bad_optional_access,用这种方式访问一个空的std::optional是一个未定义的行为. reset()清除std::optional包含的对象,让它为空. int main() { std::"; std::optional<string> opt = text; if (…
#include <type_traits> std::is_same 判断类型是否一致 通过std::is_same即可判断两个类型是否一样,特别在模板里面,在不清楚模板的参数时,此功能可以对一些特定的参数类型进行特殊的处理. std::is_same可以判断两种类似是否一样,那么用在模板里就是利器了,本位一开始提到的那个问题就可以这样写: #include <iostream> template<typename TYPE> typeCheck(TYPE data)…
std::bind() std::bind 主要用于绑定生成目标函数,一般用于生成的回调函数,cocos的回退函数都是通过std::bind和std::function实现的.两个点要明白: 1.绑定全局或者静态函数比绑定成员函数少了个成员变量,且不需要引用如下 //绑定全局函数    auto pfunc = std::bind(func1, 3);    //绑定静态函数    pfunc = std::bind(Func::func6, 3);    //绑定类成员函数,函数前需要添加引用…
{ 0. C++ 标准库使用比如vector::push_back 等这类函数时,会对参数的对象进行复制,连数据也会复制.这就会造成对象内存的额外创建, 本来原意 是想把参数push_back进去就行了,通 过std::move,可以避免不必要的拷贝操作. 1. std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝所以可以提高利用效率,改善性能.. 2. 对指针类型的标准库对象并不需要这么做. }…
std::move是一个用于提示优化的函数,过去的c++98中,由于无法将作为右值的临时变量从左值当中区别出来,所以程序运行时有大量临时变量白白的创建后又立刻销毁,其中又尤其是返回字符串std::string的函数存在最大的浪费. 比如: std:: s = readFileContent(fileName); 因为并不是所有情况下,C++编译器都能进行返回值优化,所以,向上面的例子中,往往会创建多个字符串.readFileContent如果没有内 部状态,那么,它的返回值多半是std::str…
http://www.cnblogs.com/cbscan/archive/2012/01/10/2318482.html http://blog.csdn.net/fcryuuhou/article/details/8568194 std::move是一个用于提示优化的函数,过去的c++98中,由于无法将作为右值的临时变量从左值当中区别出来,所以程序运行时有大量临时变量白白的创建后又立刻销毁,其中又尤其是返回字符串std::string的函数存在最大的浪费. 比如: 1 std::string…
C++11的模板类型判断--std::is_same和std::decay 问题提出:有一个模板函数,函数在处理int型和double型时需要进行特殊的处理,那么怎么在编译期知道传入的参数的数据类型是int型还是double型呢?  如: #include <iostream> template<typename TYPE> void typeCheck(TYPE data) { //do something check data type //std::cout<<…
一.传统的获取系统时间的方法 传统的C++获取时间的方法须要分平台来定义. 相信百度代码也不少. 我自己写了下,例如以下. const std::string getCurrentSystemTime() { if (PLATFORM_ANDROID || PLATFORM_IOS) { struct timeval s_now; struct tm* p_tm; gettimeofday(&s_now,NULL); p_tm = localtime((const time_t*)&s_n…