`
varsoft
  • 浏览: 2422530 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

STL知识准备: 1. C++关键字typename

阅读更多

/*******************************************************************************
* SGI*STL是STL之父Alexander Stepanov和STL巨匠Matt Austern等人的作品, 是当今 *
* 最富盛名、最出色的STL实现版本,全部源代码和说明文档可从www.sgi.com/STL/下 *
* 载, 是我们学习STL的最佳范本. 但是众所周知, STL使用了大量复杂艰深的C++特性, *
* 加上STL本身的复杂和庞大, 使得阅读代码本身就成为一件非常困难的工作. 以下文 *
* 字是我在学习STL过程中得到的一些经验和猜测, 希望能对大家有所帮助, 更希望能 *
* 得到大家的批评和指正, 以利于我们的共同提高. *
* myan *
*******************************************************************************/

在SGI*STL源代码里, typename这个新的C++关键字得使用可以说是随处可见. 很多以前学习过
C++的人可能还不认识typename, 其实它的常规用法很简单: 在声明模板函数或者模板类时,
传统的写法:
template <class T>
generic_function() {
//........
}

亦可以写成
template <typename T>
------------
generic_func() {
//...............
}
引入这个关键字主要是为了避免class可能给人带来的混淆.
本来typename的用法就是这么简单, 但是STL源代码中还有typename的一种不常见的用法, 如果
不了解, 阅读源代码时就会遇到困难. 因为目前我找不到有关这个问题的说明, 所以自己试验了
一下, 得到一个猜测, 现简介如下, 请有识之士斧正.

首先看一段SGI*STL源代码, 摘自stl_iterator.h

1: template <class _Container, class _Iterator>
2: inline insert_iterator<_Container> inserter(_Container& __x, _Iterator __i)
3: {
4: typedef typename _Container::iterator __iter;
5: return insert_iterator<_Container>(__x, __iter(__i));
6: }

令人费解的部分在第四行. 请大家在看我的解释之前先想一想, 我不敢保证下面解释的正确性和
全面性.

解释:
我认为typename的语义是: 通知编译器, 在typename后面被声明的东西是一个类型, 而不是别的
什么东西.

例子:
// tpname.cpp
#include <iostream>
#include <typeinfo> // for typeid() operator

using namespace std;

template <typename TP>
struct COne { // default member is public
typedef TP one_value_type;
};

template <typename COne> // 用一个模板类作为模板参数, 这是很常见的
struct CTwo {
// 请注意以下两行
// typedef COne::one_value_type two_value_type; // *1
typedef typename COne::one_value_type two_value_type; // *2
};

// 以上两个模板类只是定义了两个内部的public类型, 但请注意第二个类CTwo的two_value_type类型
// 依赖COne的one_value_type, 而后者又取决于COne模板类实例化时传入的参数类型.

int main()
{
typedef COne<int> OneInt_type;
typedef CTwo< OneInt_type > TwoInt_type;
TwoInt_type::two_value_type i;
int j;
if ( typeid(i) == typeid(j) ) // 如果i是int型变量
cout << "Right!" << endl; // 打印Right
return;
}
// ~tpname.cpp

以上例子在Linux下用G++ 2.91编译通过, 结果打印"Right". 但是如果把*1行的注释号去掉, 注释
*2行, 则编译时报错, 编译器不知道COne::one_value_type为何物. 通常在模板类参数中的类型到
实例化之后才会显露真身, 但这个CTwo类偏偏又要依赖一个已经存在的COne模板类, 希望能够预先
保证CTwo::two_value_type与COne::one_value属于同一类型, 这是就只好请typename出山, 告诉
编译器, 后面的COne::one_value_type是一个已经存在于某处的类型的名字(type name), 这样编译
器就可以顺利的工作了.

分享到:
评论

相关推荐

    threejs源码(threejs知识点:1.模型分析)

    threejs源码(threejs知识点:1.模型分析)threejs源码(threejs知识点:1.模型分析)threejs源码(threejs知识点:1.模型分析)threejs源码(threejs知识点:1.模型分析)threejs源码(threejs知识点:1.模型分析)

    STL.rar_C++ STL_STL_site:www.pudn.com_visual c

    stl容器简介,包括STL概念及具体容器使用方法等

    STL.rar_STL_site:www.pudn.com

    STL 我觉得STL是一个很好的编程工具,你会发现它能带给你很多

    STL.ppt课件STL.ppt课件STL.ppt课件

    STL.ppt课件STL.ppt课件STL.ppt课件STL.ppt课件STL.ppt课件STL.ppt课件STL.ppt课件STL.ppt课件STL.ppt课件STL.ppt课件STL.ppt课件STL.ppt课件STL.ppt课件STL.ppt课件STL.ppt课件

    stl.rar_site:www.pudn.com

    STL示例程序,对于STL初学者很有用. 斑竹,居然找不到相应的分类,STL可是十分重要的东西.

    c++语言参考速查工具

    6.C++关键字 7.标准C的标准输入输出 8.标准c字符和字符串 9.标准c数学函数 10.标准c时间与日期函数 11.标准c内存函数 12.其他标准c函数 13.C++标准输入输出 标准模板库(STL) 部分 1.C++中的字符串类...

    stl库手册_c++.rar

    用来查找算法 如 istream::read // read a file into memory #include #include using namespace std; int main () { int length; char * buffer; ifstream is; is.open ("test.txt", ios::binary );...

    stl的学习:c++ STL

    c++ STL, stl,stl的学习c++ STL, stl,stl的学习c++ STL, stl,stl的学习c++ STL, stl,stl的学习

    刷leetcode不用stl-Review-Coding:恶补基础知识+修炼动手能力

    刷leetcode不用stl Review-Coding 恶补基础知识+修炼动手能力 相关参考 1.知乎: 2.牛客: 3.c++那些事: 4.interview: 5.CS-Notes: 6.哔哩哔哩: 刷题相关 1.力扣热题100: 2.PAT: 3.柳婼 の blog: 数据结构和...

    tree-3.1: tree.hh: an STL-like C++ tree class

    The tree.hh library for C++ provides an STL-like container class for n-ary trees, templated over the data stored at the nodes. Various types of iterators are provided (post-order, pre-order, and ...

    STL.zip_site:www.pudn.com

    STL标准库学习教程和示例程序,对于学习VC非常有用。

    Packt.C++.17.STL.Cookbook.2017

    Packt.C++.17.STL.Cookbook.2017

    计算多边形内最大矩形的c++代码

    计算多边形内最大矩形的c++代码,只有一个头文件,要用到OpenCV+STL,有例程,根据网上代码(QT版C++代码)修改而成,修改内容包括: 1. 把QT的东西用OpenCV和STL替换 2. 去掉了部分bug 3. 注释掉了部分代码 4. ...

    c++服务器开发精髓,三个具体案例解析.docx

    # c++服务器开发精髓,三个具体案例解析 本文将介绍c++服务器开发的精髓,包括以下内容: 1. 网络编程基础 2. 多线程编程 3. 内存管理 4. 数据库连接 5. 性能优化技巧 ## 网络编程基础 在c++服务器开发中,网络...

    STL_doc...

    C++STL........................

    Learn.C++.Programming.Language.Become.A.Complete.C++.Programmer.pdf

    Title: Learn C++ Programming Language: Become A Complete C++ Programmer Author: Virender Singh Length: 1018 pages Edition: 1 Language: English Publication Date: 2015-10-01 This Book Teaches C++ In ...

    Mastering the C++17 STL.zip

    You will learn the key differences between classical polymorphism and generic programming, the foundation of the STL. You will also learn how to use the various algorithms and containers in the STL ...

    DEVCPP智能开发平台(支持画图,win10系统支持语音)

    创建三维动画工程教程:lesson1.docx ASCII码格式的STL模型库:STLASCII.rar 主要特点和功能: 1.标准NOI竞赛环境,编译器为GCC4.8.4 2.基于opengl三维动画引擎,实现三维图形、动画的绘制 3.支持语音交互功能,...

    c++STL容器适配器习题答案.docx

    c++STL容器适配器习题答案.docxc++STL容器适配器习题答案.docx

Global site tag (gtag.js) - Google Analytics