STL学习笔记(0)可能困惑的C++语法

1. __STL_STATIC_TEMPLATE_MEMBER_BUG

如果编译器无法处理static member of template classes(模板类静态成员)就定义

即对于模板类中,模板类型不同时的静态变量不同。

template <typename T>
class test{
public:
	static int _data;
}

int test<int>::_data=1;
int test<char>::_data=2;

2.__STL_CLASS_PARTIAL_SPECIALIZATION

如果编译器支持 partial specialization of class templates(模板类偏特化)就定义。
在模板类一般化设计之外(全特化),针对某些template做特殊设计。
“所谓的partial specialization的另一个意思是提供另一份template定义式,而其本身仍是templatized”
全特化就是所有的模板都为具体的类。
T* 特化允许用指针类型匹配的模式(也只能匹配指针类型)。
const T* 特化允许使用指向const的指针 类型匹配(也只能匹配指向const的指针)。

//一般化设计,非特化情况均使用这个
template <class I,class O>
struct test{
	test() { cout << "I, O" <<endl; }
};

//特殊化设计1(偏特化1)
template <class T>
struct test <T* ,T*> {
	test() { cout << "T* ,T*" << endl; }
};

//特殊化设计2(偏特化2)
template <class T>
struct test <const T* ,T*> {
	test() { cout << "const T* ,T*" << endl; }
};
//测试
int main() {
	test<int, char> obj1;         //I, O
	test<int*, int*> obj2;        //T*, T*
	test<const int*, int*> obj3;  //const T*, T*
}

3 __STL_FUNCTION_TMPL_PARTIAL_ORDER

如果编译器支持partial ordering of function templates或者说partial specialization of function templates就定义。

template <class T,class Alloc=alloc>
class vec {
public:
	void swap(vec<T, Alloc>&) { cout << "swap1()" << endl; }
};

#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
template <class T, class Alloc = alloc>
inline void swap(vec<T, Alloc>& a, vec<T, Alloc>& b) { a.swap(b); }
#endif

int main() {
	vec<int> a, b;
	swap(a, b);
}

4__STL_MEMBER_TEMPLATES

如果编译器支持template members of classes(模板类内嵌套模板) 就定义。


class vec {
public:
	typedef T value_type;
	typedef value_type* iterator;

	template<class I>
	void insert(iterator position, I first, I last) {
		cout << "insert()" << endl;
	}
};

int main() {
	int ia[5] = { 0,1,2,3,4 };
	vec<int> a;
	vec<int>::iterator ite;
	a.insert(ite, ia, ia + 5);
}

5. __STL_LIMITED_DEFAULT_TEMPLATES

如果编译器支持一个template参数可以根据前一个template的参数设置就定义。

template <class T,class Alloc=alloc,size_t BufSiz=0>
class deque {
public:
	deque() { cout << deque() << endl; }
};

template <class T,class Sequence=deque<T>>
class stack {
public:
	stack() { cout << "Stack" << endl; }
private:
	Sequence c;
};

int main() {
	stack<int> x;
}

6__STL_NON_TYPE_TMPL_PARAM_BUG

测试类模板是否使用非类型模板参数(non-type template parameters)

当以类型(type)作为模板参数的时候,代码中未决定的是类型;

当以一般的数字(non-type)作为模板参数的时候,代码中待定的内容便是某些数值。使用者这种模板必须要显示指定数值,模板才能实例化。
通常它们只能是常数整数(constant integral values )包括枚举,或者是指向外部链接的指针。
不能把float,class-type类型的对象,内部链接(internal linkage )对象,作为非类型模板参数。

template <class T,class Alloc=alloc,size_t BufSiz=0>  //BufSiz即为非类型模板。
class deque {
public:
	deque() { cout << deque() << endl; }
};

7 __STL_NULL_TMPL_ARGS

直接理解为若允许**bound friend template(约束模板友元)**则定义为 <> ,否则为空。

friend bool ooperator== __STL_NULL_TMPL_ARGS(const stack&,const stack&);

展开后变成

friend bool ooperator== <>(const stack&,const stack&);

**bound friend template(约束模板友元)**即有缘类型取决于类被初始化时的类型,但程序必须在类外为友元提供模板定义。

template <class T,class Sequence=deque<T>>
class stack {
	//最标准的写法
	friend bool operator== <T>(const stack<T>&, const stack<T>&);
	friend bool operator< <T>(const stack<T>&, const stack<T>&);
	
	//参数列表中的<T>实际上可以忽略
	friend bool operator== <T>(const stack&, const stack&);
	friend bool operator< <T>(const stack&, const stack&);
	
	//当可以从参数中推断出模板类型时,可以改用<>
	friend bool operator== <>(const stack&, const stack&);
	friend bool operator< <>(const stack&, const stack&);
	
	//下面用法是错误的!
	//friend bool operator== (const stack&, const stack&);
	//friend bool operator< (const stack&, const stack&);
public:
	stack() { cout << "Stack" << endl; }
private:
	Sequence c;
};
//定义部分懒得写了,但必须要写!

8.__STL_TEMPLATE_NULL

即 template <> 显示的模板特化 。

#ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
# define __STL_TEMPLATE_NULL template<>
#else
# define __STL_TEMPLATE_NULL
#endif

**模板特化(class template explicit specialization)**即指定一种或多种模板形参的实际值或实际类型,作为特殊情况。(与模板类型偏特化不同!)

template<class type> struct __type_traits{ ...};//非特化情况均使用这个
__STL_TEMPLATE_NULL struct __type_traits<char> { ... };//特化char情况

template<class Key> struct hash { };//非特化情况均使用这个
__STL_TEMPLATE_NULL struct hash<char> { ... };//特化char情况
__STL_TEMPLATE_NULL struct hash<unsgned char> { ... };//特化unsigned char情况

经展开后:

template<class type> struct __type_traits{ ...};//非特化情况均使用这个
template<> struct __type_traits<char> { ... };//特化char情况

template<class Key> struct hash { };//非特化情况均使用这个
template<> struct hash<char> { ... };//特化char情况
template<> struct hash<unsgned char> { ... };//特化unsigned char情况

9 function call操作符与仿函数

对某一类重载其()操作,并可指定初值,使用时相当于调用该类的临时对象的()操作。常用于与算法的搭配上。

template<typename T>
class print {
public:
	void operator()(const T& elem) {
		cout << elem << " ";
	}
};
template<typename T>
class plus{
public:
	T operator()(const T& x, const T& y)const { return x + y; }
};

int main() {
	vector<int> ai({ 1,2,3,4,5 });
	for_each(ai.begin(), ai.end(), print<int>());
	int a = 5, b = 3;
	print<int>()(plus<int>()(a, b));
}
全部评论

相关推荐

10-16 09:58
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
废铁汽车人:秋招真是牛鬼蛇神齐聚一堂
点赞 评论 收藏
分享
11-28 17:48
中山大学 C++
点赞 评论 收藏
分享
评论
点赞
1
分享
正在热议
# 25届秋招总结 #
443331次浏览 4520人参与
# 春招别灰心,我们一人来一句鼓励 #
42187次浏览 537人参与
# 阿里云管培生offer #
120436次浏览 2220人参与
# 地方国企笔面经互助 #
7973次浏览 18人参与
# 同bg的你秋招战况如何? #
77166次浏览 569人参与
# 实习必须要去大厂吗? #
55811次浏览 961人参与
# 北方华创开奖 #
107471次浏览 600人参与
# 虾皮求职进展汇总 #
116310次浏览 887人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11683次浏览 289人参与
# 实习,投递多份简历没人回复怎么办 #
2454962次浏览 34861人参与
# 提前批简历挂麻了怎么办 #
149927次浏览 1978人参与
# 在找工作求抱抱 #
906096次浏览 9421人参与
# 如果公司给你放一天假,你会怎么度过? #
4762次浏览 55人参与
# 你投递的公司有几家约面了? #
33209次浏览 188人参与
# 投递实习岗位前的准备 #
1196037次浏览 18550人参与
# 机械人春招想让哪家公司来捞你? #
157648次浏览 2267人参与
# 双非本科求职如何逆袭 #
662384次浏览 7397人参与
# 发工资后,你做的第一件事是什么 #
12806次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35906次浏览 384人参与
# 简历中的项目经历要怎么写? #
86937次浏览 1516人参与
# 参加完秋招的机械人,还参加春招吗? #
20153次浏览 240人参与
# 我的上岸简历长这样 #
452074次浏览 8089人参与
牛客网
牛客企业服务