这个专栏用于整理学习STL过程中碰到的问题
- typename
- traits编程
- std::remove_reference
- std::move
- std::forward
typename
STL中到处都是 typename …; typedef typenmae … 的用法,但是一开始真的不知道是在搞些什么玩意。
//略去了参数与函数体,返回值为什么要搞个typename?
typename iterator_traits<RandomIter>::difference_type
distance_dispatch(...){
....}
//我们可以知道这是在定义类型别名,但是到底为什么要搞个typename??
typedef typename value_traits_type::key_type key_type;
直到看了篇大佬的博客,现在正好整理一下…
我们在类外访问类内中的名称时,可以使用类作用域操作符,ClassName::name。且调用通常存在三种:静态数据成员,静态成员函数,嵌套类型。
struct MyClass{
static int a;
static int b();
typedef itn c;
};
我们可能会定义这样的一种模板
template<class T>
void fun(){
T::iterator *iter;
}
我们会很自然的认为这是在定义一个iter的指针,指向类作用域的iterator,像这样。
struct Ttype{
struct iterator{
/*...*/};
};
但是,如上述,我们的ClassName::name调用可能会有这样的情况。
struct Ttype{
static int iterator;
};
那么类模板中的定义的 T::iterator *iter就成了一个乘法表达式…
由于这两种情况我们没有办法区分,所以,C++标准引入了typename。
template<class T>
void fun(){
typename T::iterator *iter; //指定后面的对象(T::iterator)是一个类型