最近在看C++的模板,虽然学了、用了C++也有一段时间,对于模板编程这一特性一直没有接触。边学习, 一边写些心得吧。
1. typename关键字
不用说,接触过模板的人都知道,typename在模板声明的时候可以代替class关键字,二者可以互换,如:
template<class A, size_t N = 10>
class Container
{
public:
void push(const A& a)
private:
A a[N];
size_t count;
};
写成typename也是一样的
template<typename A, size_t N = 10>
class Container
{
public:
void push(const A& a)
private:
A a[N];
size_t count;
};
但是,typename在模板编程中更重要的用法是:当一个模板代码中某个类型被模板类型参数限定时,必须使用typename关键字
什么意思呢?看下面的例子:(借用下 《C++编程思想2》中的例子)
template<class T>
class X
{
public:
void f(){ i.g(); }
private:
typename T::id i;
};
上面的例子就是:在模板中,类型T限定了类型id。 也就是说id取决于T。这种情况下,编译器不知道 id是类型T中的静态成员变量,还是T的嵌套类。
在默认情况下,编译器将id当作静态成员变量或者是枚举来对待。在这个例子中,显然 id 是个类型(但是编译器不知道),这就需要我们通过typename 这个关键字来告诉编译器,将后面的这个 T::id 当作类型,然后声明个变量 i。也就是将被限定的关键字 id 解析成类型。
2. template关键字
同样 template关键字的作用不言而喻,最常见的 声明模板时用的关键字。他也有特殊的用武之地。
在模板编程中 < 和 > 字符有时代表小于号,大于号。有时候就是作为模板参数列表的界定符。可以用template关键字来区分。
template<class charT,size_t N>
basic_string<charT> bitsetToString(const bitset<N>&bs)
{
retrun bs. template to_string<charT,char_traits<charT>.allocator<charT> >();
}
关键字 template 写在 对象b的点运算符的右边,告诉编译器后面的是个模板的名称。如果不写 template 的话,< 就被解释成小于号。
觉得这两个关键字有点意思,做了下小总结。程序可能有错误的地方,欢迎指正。
PS:参考《C++编程思想》第二卷。本来想自己写些例子的,发现刚接触,水平有限,为了程序没有错,借用书中的例子了。