随笔分类 - C++
摘要:这个技巧,不仅能够侦测预定义的转换,也能够侦测用户自定义的转换。
阅读全文
摘要:体会这一个例子,检查是否是一个类:P187
阅读全文
摘要:首先,类模板必须被显式特化。当然了,可以通过一个辅助函数,通过参数类型,返回特化的类模板,来间接处理。 这个技术被广泛应用在ptr_fun, make_pair, mem_fun, back_inserter等辅助函数里面,来完成那些易于出错的类模板特化任务。 跟函数实参推导(根据实参所在的名字空间
阅读全文
摘要:一个是元素类型,一个是配置器类型。 当实例化一个 vector<int>这样的标准容器的时候,得到的其实是 vector<int, std::allocator<int>>。 但是后一个参数可以有缺省值,如下: template <typename T, class Cont=Deque<T> >
阅读全文
摘要:traits基本利用了上一篇文章的思想,通过局部特化,来返回针对特定类型的信息。 可以自己实现traits,约定俗成了,返回特性信息。 也可以利用iterator的traits信息。 iterator就是一个从不同容器内获取各自不同类型迭代器的经典例子。获得特定类型迭代器之后,就可以利用迭代器的tr
阅读全文
摘要:上一次面试也问到的。的确是利用了模板元编程。traits也是利用了这一点。 可以方便的获知一个类是不是int. 更重要的是,编译器获知一个变量,是不是指针;是不是数组,甚至是数组的长度;获知是不是指向数据成员的指针。 关于数组和数组长度:
阅读全文
摘要:其实一个重要思想就是利用局部特化。注意特化不仅仅可以用类型,还可以用数值。如下:
阅读全文
摘要:模板成员指的是模板里面的成员,有的成员(函数)可以特化。 template<> void ClassA<int> func(); 成员模板,指的是自身是模板的成员。 template <typename T> SList(T begin, T end); 成员模块,还可以用来写拷贝构造函数和赋值操作
阅读全文
摘要:都跟里氏替换原则有关。 协变:你可以用一个子类对象去替换相应的一个父类对象,这是完全符合里氏替换原则的,和协(谐)的变。如:用Swan替换Bird。 逆变:你可以用一个父类对象去替换相应的一个子类对象,这貌似不符合里氏替原则的,不和协(谐)的逆变。如:用Bird替换Swan。
阅读全文
摘要:局部特化所用的类型,可以由多个类型组成,比如: 也可以只针对成员函数进行特化。
阅读全文
摘要:注意,显式特化不是一个模板。如果是类型跟显式特化一样,那么不是实例化。 显式特化类的函数,不需要再加template,因为不是模板方法。 特化类的函数跟模板类不一定要一样,但是一样更好。 不支持局部特化函数,仅支持局部特化类。 局部特化,跟偏特化不同。 下面这个叫作局部特化: 原则:最具体的,限制性
阅读全文
摘要:查看这里: http://www.cplusplus.com/reference/iterator/back_inserter/ 是用来在最后插入的 注意,这个函数,是隐式特化了。
阅读全文
摘要:new包含两步,调用operator new申请空间,以及调用构造函数。 如果第一步结束之后,第二步发生异常,需要归还第一步的空间。 编译器帮我们做了这件事情,并且会调用对应的delete。 另外 new 会调用类定义的 operator new,而::new 会调用默认的operator new.
阅读全文
摘要:一般在new一个数组的时候,会先申请 unit * size + delta 大小的空间。delete的时候也要指定delete的是数组。
阅读全文
摘要:注意,我们无法改变new和delete操作符。 但是我们可以重载来里面的operator new 和 operator delete 方法,这个方法是被new操作符调用的,调用之后获得地址,会继续用构造函数初始化。 另有一种operator new的方法叫作placement new,被禁止替换,(
阅读全文