几乎所有STL库都是模板。
编译器不会为每种类型都生成代码,而只是为所要用的类型生成,因此你必须让你的模板函数在被调用的时候其实现是可见的,编译器才能编译该函数为特定的类型。因此,要使得模板可移植,你需要将函数的实现包含在头文件中,并且是内联(inline)函数。
无类型模板参数
即模板参数为值,而不是类型,编译时会被替换为常量。
例如:
bitset<32> flags32;
bitset<64> flags64;
注意:这里flags32和flags64是不同的类型。
Typename 关键字
关键字typename 指明它后面的标识符是一种类型。
例如:
template <class T>
class MyClass {
typename T::SubType *ptr;
};
这里指定SubType为一种类型,而不是T的静态变量。
成员模板
成员模板经常用于自动类型转换。
例如:
template <class T>
class MyClass {
public:
MyClass() {
T _value = T();
}
template <class U>
MyClass(const MyClass<U>& u_) {
assign(u_);
}
template <class U>
void assign(const MyClass<U>& u_) {
_value = u_.getValue();
}
T getValue() const {
return _value;
}
private:
T _value;
};
…
void foo() {
MyClass<double> dm;
MyClass<double> dm1(dm);
}
关键字
explicit
关键字explicit可以防止将一个值隐式转换为一个对象,如果这个对象的类的构造函数是单个参数。一个常见的例子:一个集合的类用一个大小作为初始化参数,
class Stack {
explicit Stack(int size_); //创建一个大小为size_的栈
};
Stack s;
…
s = 4; //如果没有explicit 那么将创建一个大小为4的新栈并赋给s
工具
pairs
pairs的比较,first的优先级最高,比较时,先考虑first的大小,如果first相等,再比较second.
auto_ptr
不推荐使用,建议用boost smart pointer 代替。
Numeric Limits
C++标准库提供了numeric_limits,来替代和补充C宏。
numeric_limits 提供了类型安全,并且让程序员能写模板评估(evaluate)这些限制。
辅助函数(
Auxiliary Functions
)
std::max的参数必须是同一种类型,如果不同类型,要显示指定类型做隐式转换。
int i = 5;
long l = 10L;
//long max = std::max(i, l); Error
long max = std::max<long>(i,l);
3COME考试频道为您精心整理,希望对您有所帮助,更多信息在http://www.reader8.com/exam/