c++11新特性.md
2020/4/9
4 / 19
C++11以前,可能要实现这个功能十分复杂,需要有一个复制构造函数是 private的基类,然后让子类继承这
个基类来实现,c++中好像有一个 boost::noncopyable实现了一个把复制构造函数放在private的基类)
5. Alias Template(template typedef)
eg:
template <typename T>
using Vec = std::vector<T,MyAlloc<T>>;
Vec<int> coll;
// 等价于
std::vector<int,MyAlloc<int>> coll;
ps: 使用 macro(宏) 和 typedef 都无法达到相同的效果 eg: typedef std::vector<int,MyAlloc<int>> Vec
, 虽然可以直接用Vec但是无法指定参数 eg: #define Vec<T> template<typename T>
std::vector<T,MyAlloc<T>> Vec<int> 等价于 template<typename int>
std::vector<int,MyAlloc<int>> 很不自然(不像是在定义一个变量)
但是 不能对 Alias Template 进行特化或者偏特化
5.1. alias template 实战
//一开始用到了模板的模板这一比较艰涩的c++模板技巧
template<typename T,
template<class> // 这里的第二个模板参数表示,这个模板参数也是一个模板,
class Container //内层的模板接受一个参数(可省略,在这里就省略了
>
class XCLs
{
private:
Container<T> c;
public:
XCls(){
for(long i =0;i<SIZE;++i)
c.insert(c.end(),T());
output_static_data(T());
Container<T> cl(c);
Container<T> c2(std::move(c));
c1.swap(c2);
}
}
XCls<int,vector> cl; //这么调用事实上是错的,因为 vector的模板参数有两个
// vector的第二个模板参数有默认值,并且这一个默认值是以第一个模板参
数为基础推出来的
// 具体可以看一下 vector 的类定义
// 在引入化名模板之后就可以解决上述的问题了