std::decay】的更多相关文章

参考资料 • cplusplus.com:http://www.cplusplus.com/reference/type_traits/decay/ • cppreference.com:http://en.cppreference.com/w/cpp/types/decay std::decay简介 • 类模板声明 // cplusplus.com template <class T> struct decay; // MS C++ 2013template <class _Ty>…
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<<…
#include <type_traits> std::is_same 判断类型是否一致 通过std::is_same即可判断两个类型是否一样,特别在模板里面,在不清楚模板的参数时,此功能可以对一些特定的参数类型进行特殊的处理. std::is_same可以判断两种类似是否一样,那么用在模板里就是利器了,本位一开始提到的那个问题就可以这样写: #include <iostream> template<typename TYPE> typeCheck(TYPE data)…
这里是最初始的版本,参考https://github.com/cplusplus-study/fork_stl/blob/master/include/bind.hpp 提供了最简洁的实现方式. 第一部分是bind的实现代码, 第二部分是测试代码, 对bind的实现代码中有疑问或不明白的,可参考测试代码, 测试代码基本说明了某个代码的基本含义和用途. 1. 实现 ///////////////////////////////////////////////////////////////////…
template<typename Function, typename Tuple, std::size_t... Index> decltype(auto) invoke_impl(Function&& func, Tuple&& t, std::index_sequence<Index...>) { return func(std::get<Index>(std::forward<Tuple>(t))...); } te…
目录 前言 一.std::function的原理与接口 1.1 std::function是函数包装器 1.2 C++注重运行时效率 1.3 用函数指针实现多态 1.4 std::function的接口 二.std::function的实现 2.1 类型系统 2.1.1 异常类 2.1.2 数据存储 2.1.3 辅助类 2.1.4 内存管理基类 2.1.5 仿函数调用 2.1.6 接口定义 2.1.7 类型关系 2.2 方法的功能与实现 2.2.1 多态性的体现 2.2.2 本地函数对象 2.2…
前言 最近想起半年前鸽下来的Haskell,重温了一下忘得精光的语法,读了几个示例程序,挺带感的,于是函数式编程的草就种得更深了.又去Google了一下C++与FP,找到了一份近乎完美的讲义,然后被带到C++20的ranges library,对即将发布的C++20满怀憧憬.此时,我猛然间意识到,看别人做,觉得自己也能做好,在游戏界叫云玩家,在编程界就叫云程序员啊! 不行,得找点事干.想起同样被我鸽了很久的<functional>系列,刚好与函数式编程搭点边,就动笔写吧!这就是本文的来历. 找…
假设有一个接收universal references的模板函数foo,定义如下: template<typename T> void foo(T&& t) { cout << "foo(T&& t)" << endl; } 如果想对某些类型做特殊处理,写一个重载版本的foo,比如想对float类型做特殊处理,就写一个接收float类型的foo: void foo(float n) { cout << &q…
本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 Item 26已经解释了,不管是对全局函数还是成员函数(尤其是构造函数)而言,对universal引用的重载会导致一系列的问题.到目前为止,我也已经给出了好几个例子,如果它能表现得和我们期待的一样,这种重载也能很实用.此Item会探索如何让这种重载能实现我们所需求的行为.我们可以设计出避免对universal引用进行重载的实现,也可以通过限制参数的类型,来使…
环境Linux g++6.3.0 问题一:一个ip地址如何接收高并发请求 问题二:如何高并发响应消息 发送请求端只能通过ip地址+端口号向服务器发送请求码,所以服务器只能用一个UDP去绑定此ip以及端口号.而如何完成高并发发送响应消息, 谁去发送这个响应消息,接收请求信息的UDP?这就造成其中一个任务必须等待另一个任务执行完毕,sendto是非阻塞,而recvfrom是阻塞,若 执行recvfrom碰巧没有下个请求信息或者网络阻塞造成UDP丢失,那么sendto岂是不能执行(一直等待recvfr…
1. any类的实现 (1)any类: ①是一个特殊的,只能容纳一个元素的容器,它可以擦除类型,可以将何任类型的值赋值给它. ②使用时,需要根据实际类型将any对象转换为实际的对象. (2)实现any的关键技术 ①当赋值给any时,需要将值的类型擦除,即以一种通用的方式保存所有类型的数据.通常是通过继承去擦除类型,基类是不含模板参数的,派生类才含有所要包装对象的类型. ②赋值时,创建派生类对象赋值给基类指针,派生类携带了数据类型,通过赋值兼容原则擦除了原始数据类型.当需要取数据时,再向下转换成派…
1. function_traits (1)function_traits的作用:获取函数的实际类型.返回值类型.参数个数和具体类型等.它能获取所有函数语义类型信息.可以获取普通函数.函数指针.std::function.函数对象和成员函数等的相关信息. (2)实现function_traits的关键技术 ①通过模板特化和可变参数模板来实现. ②针对成员函数和仿函数的特化版本需要注意const和volatile版本的定义. ③function_traits函数的入参是可变参数模板,其类型和个数都…
1. type_traits类型萃取 (1)type_traits通过定义一些结构体或类,并利用模板类特化和偏特化的能力,给类型赋予一些特性,这些特性根据类型的不同而异.在程序设计中可以使用这些traits来判断一个类型的一些特性,引发C++的函数重载机制,实现同一种操作因类型不同而异的效果. (2)type_traits提供了丰富的编译期计算.查询.判断.转换和选择的帮助类. (3)type_traits的类型选择功能,在一定程序上可以消除冗长的switch-cast或if-else的语句.提…
C++作为一门Native Langueages,在C++98/03时代,资源管理是个大问题.而内存管理又是其中最大的问题.申请的堆内存需要手动分配和释放,为了确保内存正确释放,一般原则是"谁分配谁负责释放",但软件工程的复杂性.程序员的编码水平参差不齐等仍然导致内存泄漏.空悬指针等问题.严重的内存泄漏可能很快导致服务器内存耗光而运行崩溃. 托管语言(JAVA.C#.C++ CLI等)为了解决这种问题引入了GC,把内存管理交给机器处理.而C++的解决办法一个是重启程序(内存泄漏严重时)…
在boost库中,any是一种特殊容器,只能容纳一个元素,但这个元素可以是任意的类型----int.double.string.标准容器或者任何自定义类型.程序可以用any保存任意的数据,也可以在任何需要的时候取出any中的数据.any类目前已经加入到c++17标准中,在vs2017中include<any>头文件即可使用. vs2017里的标准库any的头文件最后有句提示: #pragma message("class any is only available with C++1…
1.概述 模版元编程(template metaprogram)是C++中最复杂也是威力最强大的编程范式,它是一种可以创建和操纵程序的程序.模版元编程完全不同于普通的运行期程序,它很独特,因为模版元程序的执行完全是在编译期,并且模版元程序操纵的数据不能是运行时变量,只能是编译期常量,不可修改,另外它用到的语法元素也是相当有限,不能使用运行期的一些语法,比如if-else,for等语句都不能用.因此,模版元编程需要很多技巧,常常需要类型重定义.枚举常量.继承.模板偏特化等方法来配合,因此编写模版元…
1.概述 关于C++11模板元的基本用法和常用技巧,我在程序员2015年2月B<C++11模版元编程>一文(后称前文)中已经做了详细地介绍,那么C++11模版元编程用来解决什么实际问题呢,在实际工程中又该如何应用呢?本文将侧重介绍C++11模板的一些具体应用,向读者展示模版元编程的具体应用. 我们将展示如何通过C++11模版元来实现function_traits.Vairant类型和泛型bind绑定器.function_traits侧重于如何萃取可调用对象的一些元信息,Variant则是一种能…
// clang++ 3.5 // maybe gcc 4.9 support it, but I don't test it #include<iostream> int main() { auto fac = [&](auto&& self, int x)->int{ ? : x * self(self, x - ); }; std::cout<<fac(fac, )<<std::endl; ; } 作者:蓝色 链接:https://w…
直接上代码吧 to do // 111111.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <map> #include <sstream> #include <algorithm> #include <vector> #include <tuple> #include <type_traits> usin…
上一篇博文用c++11实现了variant,有童鞋说何不把any也实现一把,我正有此意,它的兄弟variant已经实现了,any也顺便打包实现了吧.其实boost.any已经挺好了,就是转换异常时,看不到详情,和boost.variant一样的问题.实现any比实现variant要简单,需要解决的关键技术是类型擦除,关于类型擦除我之前的博文有介绍,想了解的童鞋点这里. 实现any的关键技术 any能容纳所有类型的数据,因此当赋值给any时,需要将值的类型擦除才行,即以一种通用的方式保存所有类型的…
关于variant的实现参考我前面的博文,不过这第一个版本还不够完善,主要有这几个问题: 内部的缓冲区是原始的char[],没有考虑内存对齐: 没有visit功能. 没有考虑赋值构造函数的问题,存在隐患. 这次将解决以上问题,还将进一步增强variant的功能.增加的功能有: 通过索引位置获取类型. 通过类型获取索引位置. c++11的内存对齐 关于内存对齐的问题,将用c++11的std::aligned_storage来代替char[]数组,它的原型是: template< std::size…
ScopeGuard的作用是确保资源面对异常时总能被成功释放,就算没有正常返回.惯用法让我们在构造函数里获取资源,当因为异常或者正常作用域结束,那么在析构函数里释放资源.总是能释放资源.如果没有异常抛出则正常结束,只是有异常发生或者没有正常退出时释放资源.关于ScopeGaurd的概念想多了解一点的童鞋点这里和这里.c#中的ScopeGuard比较简单,通过using初始化或者通过finally就可以做到,c++中需要自己去实现. c++中设计ScopeGuard的关键技术:通过局部变量析构函数…
这次要讲的内容是:c++11中的tuple(元组).tuple看似简单,其实它是简约而不简单,可以说它是c++11中一个既简单又复杂的东东,关于它简单的一面是它很容易使用,复杂的一面是它内部隐藏了太多细节,要揭开它神秘的面纱时又比较困难. tuple是一个固定大小的不同类型值的集合,是泛化的std::pair.和c#中的tuple类似,但是比c#中的tuple强大得多.我们也可以把他当做一个通用的结构体来用,不需要创建结构体又获取结构体的特征,在某些情况下可以取代结构体使程序更简洁,直观. 基本…
这次要讲的内容是:c++11中的tuple(元组).tuple看似简单,其实它是简约而不简单,可以说它是c++11中一个既简单又复杂的东东,关于它简单的一面是它很容易使用,复杂的一面是它内部隐藏了太多细节,要揭开它神秘的面纱时又比较困难. tuple是一个固定大小的不同类型值的集合,是泛化的std::pair.和c#中的tuple类似,但是比c#中的tuple强大得多.我们也可以把他当做一个通用的结构体来用,不需要创建结构体又获取结构体的特征,在某些情况下可以取代结构体使程序更简洁,直观. 基本…
一. c++ traits traits是c++模板编程中使用的一种技术,主要功能:     把功能相同而参数不同的函数抽象出来,通过traits将不同的参数的相同属性提取出来,在函数中利用这些用traits提取的属性,使得函数对不同的参数表现一致. traits是一种特性萃取技术,它在Generic Programming中被广泛运用,常常被用于使不同的类型可以用于相同的操作,或者针对不同类型提供不同的实现.traits在实现过程中往往需要用到以下三种C++的基本特性: enum.typede…
前言 之前写个过一篇博客叫<浅谈boost.variant的几种访问方式>,里面讲到了可以通过访问者方式来获取variant的值,但是在重载函数operator()里面只能够获取variant的值,如果要捕获外部变量或调用外部函数比较麻烦,那么有没有一种方法来简化variant的访问呢?当然有,下面我们让variant支持lambda表达式访问(个人博客也发表了<让boost.variant支持lambda表达式访问>). 代码 #include <iostream>…
移动语义使得编译器得以使用成本较低的移动操作,来代替成本较高的复制操作:完美转发使得人们可以撰写接收任意实参的函数模板,并将其转发到目标函数,目标函数会接收到与转发函数所接收到的完全相同的实参.右值引用是将这两个不相关的语言特性连接起来的底层语言机制,正是它使得移动语义和完美转发成了可能. 23:理解std::move和std::forward std::move并不进行任何移动,std::forward也不进行任何转发.这两者在运行期都无所作为,它们不会生成任何可执行代码.实际上,std::m…
转载地址:https://blog.csdn.net/sqcfj/article/details/86716831 mongoDB有两个接口库:mongo-c-driver和mongo-cxx-driver 前者是c代码接口库,后者是c++代码接口库,是在mongo-c-driver的基础上进行二次封装 一.准备工作 1.下载mongo-c-driver源码:https://github.com/mongodb/mongo-c-driver/releases/tag/1.13.0(注意:3.4.…
在函数模板中使用智能指针时,可能会希望根据指针的类型推导出指针引用的对象类型作为模板参数,于是写出以下代码: shared_ptr<decltype(*objPtr)>(objPtr); 一眼看上去似乎是正确的,然而实际上隐藏着一个问题会导致错误,这要从decltype()推断出的类型说起. decltype(a)推断出的类型 a为变量 这是最简单的情况,推导出的类型为a的类型T. int a = 0;decltype(a) b; //(int) b a为右值表达式 同上,推导出的类型为a的类…
引言 我有一个显示屏模块: 模块上有一个128*64的单色显示屏,一个单片机(B)控制它显示的内容.单片机的I²C总线通过四边上的排针排母连接到其他单片机(A)上,A给B发送指令,B绘图. B可以向屏幕逐字节发送显示数据,但是不能读取,所以程序中必须设置显存.一帧需要1024字节,但是单片机B只有512字节内存,其中只有256字节可以分配为显存.解决这个问题的方法是在B的程序中把显示屏分成4个区域,保存所有要绘制的图形的信息,每次在256字节中绘制1/4屏,分批绘制.发送. 简而言之,我需要维护…