最近在看c++的一些库文件,里面的一些比较陌生但看起来挺有用的一些东西,在此记下,以免日后看到再翻找资料。

template <size_t _Nb>

这是在看bitset的时候看到的,之前用bitset的时候也没太留意,这是才发现bitset的类模板参数不是一个类型,而是一个数,这才发现原来类模板参数也可以是一个数。

C++ Primer的654页提到了Nontype Template Parameters就是指这个,来看一下他给的例子。

template <unsigned N, unsigned M>
int compare(const char (&p1)[N], const char (&p2)[M])
{
return strcmp(p1, p2);
}

当我们调用

compare("hi", "mom");

相当于是调用了

int compare(const char (&p1)[3], const char (&p2)[4])

也就是说Nontype Template Parameters跟我们平常所用的模板其实是类似的,只不过平常所用的模板参数是数据类型,而这个是数,bitset就是用这个来声明bitset的位数。

这时,如果类中的一个常量成员与模板参数有关,那么这个常量成员要设为静态常量,因为对于同一个实例模板,这个成员是静态的(不随新建对象而改变)。

Conversion Operator(类型转换运算符)

operator type() const;

这是一个特殊的类成员函数,它的作用是将类转化为类型为type的值,例如operator bool() const;就是将类转化为bool,当类对象需要转化为type类型时,该函数就会被调用,与其它运算符函数不同的是,这个函数可以直接调用,例如b.operator A()就是调用b对象的类型转换运算符A。

array

我们经常用new[]来新建一个数组,但这样很容易出错,如果不小心把头指针弄丢了,那么整个数组就没了,而且新建出来的内存也会浪费掉,所以C++11新添加了一个array的数据新型,新建以后就当数组用就是了,而且与数组一样,它的内存存储是连续的。

Rvalue Reference(右值引用)

bitset::insert(const_iterator position, value_type&& val)

上面代码中的value_type&& val就是右值引用的一个例子,在C++ Primer的532页有关于Rvalue Reference的介绍,这个的主要使用是在对象要被释放之前将对象的资源(内容)移出来,而不是进行复制操作,就像原文所说的:

Rvalue reference refer to objects that are about to be destroyed. Hence, we can "steal" state from an object bound to an rvalue reference.

在平常的使用中可能没有感受到右值引用带来的好处,特别是对"steal"如何理解,我觉得知乎上Tinro的回答中对"steal"的解释挺详细的,通过右值引用这个概念可以进行很多优化。

Variadic Template

在看到这个的时候,我特别开心,因为我知道Matlab是有这个功能的,以前以为C++没有这个功能,觉得怪可惜的,现在发现可以这样用,而且与tuple配合使用可以产生许多好用的功能,举个例子(C++ Primer第700页)

template <typename T, typename... Args>
void foo(const T &t, const Args&... rest);

这就是一个可变参数模板,其中Args是一个模板参数包,rest是一个函数参数包,因此foo函数的参数只要大于一个就行,下面是一些调用的例子

int i=0; double d=3.14; string s="variadic";
foo(i, s, 42, d); //包中有三个参数
foo(s, 42, "hi"); //包中有两个参数
foo(d, s); //包中有一个参数
foo("hi"); //包中没有参数

如果对rest进行取地址的处理,那么得到的会是rest里面所有变量都取地址,用cout输出时,只需cout << rest即可按顺序输出参数。

但如果要对参数进行运算,就要用到tuple这一数据类型,tuple的每个变量的类型都可以不一样,支持取某个变量的类型,取值等操作,这样只要把用(Args, rest)新建一个tuple,就可以对里面的值进行修改。下面是tuple的例子

tuple< string, vector<double>, int, list<int> > someVal("constants", {3.14, 2.718}, 42, {0,1, 2, 3, 4, 5});
typedef decltype(someVal) trans; //trans: <string, vector<double>, int, list<int> >
tuple_element<2, trans>::type cnt=get<2>(someVal);
//tuple_element<2, trans>::type :取trans中的第2个类型,get<1>(someVal) :取someVal中的第2个数。
//所以cnt的类型为int, 数值为42

C++的那些事 1的更多相关文章

  1. 【腾讯Bugly干货分享】H5 视频直播那些事

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57a42ee6503dfcb22007ede8 Dev Club 是一个交流移动 ...

  2. CSharpGL(31)[译]OpenGL渲染管道那些事

    CSharpGL(31)[译]OpenGL渲染管道那些事 +BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一 ...

  3. TODO:字节的那点事Go篇

    TODO:字节的那点事Go篇 (本文go version go1.7.3 darwin/amd64) 在Golang中string底层是由byte数组组成的. fmt.Println(len(&quo ...

  4. Microsoft Visual Studio 2013 — Project搭载IIS配置的那些事

    前段时间在改Bug打开一个project时,发生了一件奇怪的事,好好的一直不能加载solution底下的这个project,错误如下图所示:大致的意思就是这个project的web server被配置 ...

  5. OpenNLP:驾驭文本,分词那些事

    OpenNLP:驾驭文本,分词那些事 作者 白宁超 2016年3月27日19:55:03 摘要:字符串.字符数组以及其他文本表示的处理库构成大部分文本处理程序的基础.大部分语言都包括基本的处理库,这也 ...

  6. HTTPS那些事(一)HTTPS原理

    转载来自:http://www.guokr.com/post/114121/ 谣言粉碎机前些日子发布的<用公共WiFi上网会危害银行账户安全吗?>,文中介绍了在使用HTTPS进行网络加密传 ...

  7. 做一个 App 前需要考虑的几件事

    做一个 App 前需要考虑的几件事  来源:limboy的博客   随着工具链的完善,语言的升级以及各种优质教程的涌现,做一个 App 的成本也越来越低了.尽管如此,有些事情最好前期就做起来,避免当 ...

  8. Ctrl-A全选这点事(C#,WinForm)

    所有的文本框,不管单行多行都Ctrl-A全选就好了吧?是啊,很方便.Windows的软件基本都是这样.可为什么我们自己制作的WinForm就默认不是这样呢?谁知道呢,可能是WinForm饱受诟病,要改 ...

  9. 使用Bandwagon的VPS第一件事《FQ》

    说点闲话:昨天的长靴子到了,哎呀,今天那个高兴,踩着我的8厘米的过膝靴就出门上专业外语去了,扎了个麻花辫子,那个心情好哟,搞得我都不想继续学习linux平台上的C语言了,好想逛街----秀秀我的鞋子, ...

  10. 【转载】在IT界取得成功应该知道的10件事

     在IT界取得成功应该知道的10件事 2011-08-11 13:31:30 分类: 项目管理 导读:前面大多数文章都是Jack Wallen写的,这是他的新作,看来要成为NB程序员还要不停的自我总结 ...

随机推荐

  1. this 指向问题

    你不懂JS: this 与对象原型 第二章: this豁然开朗! 在第一章中,我们摒弃了种种对this的误解,并且学习了this是一个完全根据调用点(函数是如何被调用的)而为每次函数调用建立的绑定. ...

  2. SVN Update Error: Please execute the 'Cleanup' command

    尝试用下面两种方法 svn clean up 中有一个选项break lock勾选上 把对应的文件来里的.svn里面的lock文件删除. svn local delete, incoming dele ...

  3. 阿里Java编码规范

    详细,全面 很不错 阿里 Java编码规范

  4. idea log4j 用法

    1.导入jar包 这里用的maven导入 <!-- LOGGING begin --> <dependency> <groupId>org.slf4j</gr ...

  5. 【题解】 bzoj4033: [HAOI2015]树上染色* (动态规划)

    bzoj4033,懒得复制,戳我戳我 Solution: 定义状态\(dp[i][j]\)表示\(i\)号节点为根节点的子树里面有\(j\)个黑色节点时最大的贡献值 然后我们要知道的就是子节点到根节点 ...

  6. COCI 2018/2019 CONTEST #2 Solution

    Problem1 Preokret 第一题一定不是什么难题. 第一个问题在读入的时候判断当前时间是不是在1440及以前就行 第二个问题考虑离线处理,由于每个时刻只能最多发生1个事件那么就弄个桶记录每一 ...

  7. 学习6__STM32--SPI外设之中断收发---

    <目标> STM32双机 SPI中断收发通信 <描述> # STM32双机配置为一主一从模式 # 采用主机中断发送,从机中断接收 # 收发机制采用不间断收发(发送为空就发送,接 ...

  8. 解题:NOIP 2018 保卫王国

    题面 最小支配集=全集-最大独立集 所以先把点权改成正无穷/负无穷来保证强制选/不选某个点到独立集里,然后变成了洛谷的动态DP模板 GTMDNOIP2018ZTY #include<stack& ...

  9. struts2拦截器interceptor的配置方法及使用

    转: struts2拦截器interceptor的配置方法及使用 (2015-11-09 10:22:28) 转载▼ 标签: it 365 分类: Struts2  NormalText Code  ...

  10. 流媒体技术学习笔记之(九)减少VLC 延迟的方法

    之前写过一篇关于在Linux平台上编译Android平台上VLC播放器源代码的文章,vlc这款播放器非常优秀而且是开源的,它的核心是开源视频编解码库ffmpeg.而且这款播放器还支持RTSP协议,这个 ...