C++ Template 中的typename、class关键字区别

本文详细解析了C++ Template中typename与class关键字的使用区别,包括它们在模板定义中的作用及如何使用typename指定嵌套依赖类型。

区别:http://xinklabi.iteye.com/blog/670136

在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢?

相信学习C++的人对class这个关键字都非常明白,class用于定义类,在模板引入c++后,最初定义模板的方法为: template<class T>......
在这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字,它的作用同class一样表明后面的符号为一个类型,这样在定义模板的时候就可以使用下面的方式了: template<typename T>......
在模板定义语法中关键字class与typename的作用完全一样。
typename难道仅仅在模板定义中起作用吗?其实不是这样,typename另外一个作用为:使用嵌套依赖类型(nested depended name),如下所示:
class MyArray
{
public:
typedef int LengthType;
.....
}

template<class T>
void MyMethod( T myarr )
{
typedef typename T::LengthType LengthType;
LengthType length = myarr.GetLength;
}
这个时候typename的作用就是告诉c++编译器,typename后面的字符串为一个类型名称,而不是成员函数或者成员变量,这个时候如果前面没有typename,编译器没有任何办法知道T::LengthType是一个类型还是一个成员名称(静态数据成员或者静态函数),所以编译不能够通过。
<script>window._bd_share_config={"common":{"bdsnskey":{},"bdtext":"","bdmini":"2","bdminilist":false,"bdpic":"","bdstyle":"0","bdsize":"16"},"share":{}};with(document)0[(getelementsbytagname('head')[0]||body).appendchild(createelement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new date()/36e5)];</script>
阅读(165) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~
评论热议
### C++中 `template`、`typename` `class` 的关键字用法及区别 #### 关键词定义与功能 在C++模板编程中,`template`是一个核心概念,用于实现泛型编程。它可以用来创建通用的类或函数,使得这些类或函数可以在不指定具体类型的条件下被编译使用[^1]。 对于模板参数的声明,既可以使用 `class` 也可以使用 `typename`。两者的主要用途都是为了表示一个占位符类型,该类型将在实例化时由具体的类型替代[^3]。然而,在特定情况下,两者的语义存在细微差别: - **`class`**: 主要用于传统意义上代表类的概念,尽管实际上它也支持任何合法的数据类型(包括原始数据类型)。因此,`class` 可以看作是一种更直观的方式去表达“这是一个类”的含义。 - **`typename`**: 更加现代化且推荐使用的语法形式,特别是在复杂的嵌套依赖类型的情况下更为清晰明了。例如,当涉及到某个类型是另一个类型内部成员时,必须显式地标记为 `typename` 来告诉编译器这确实是一个类型而非变量或其他实体[^4]。 #### 使用场景分析 以下是几种典型的应用场景及其对应的最佳实践建议: 1. **简单模板参数** 当只需要传递单一或者多个独立存在的类型作为模板参数时,可以选择任意一种方式: ```cpp template<class T> void function(T param); template<typename U> void anotherFunction(U param); ``` 2. **处理嵌套类型** 如果涉及到了解构复杂结构体内的类型,则应优先考虑采用 `typename` 进行修饰,以便让编译器能够正确认识到这是个类型名而不是其他东西: ```cpp template<typename Container> auto getFirstElement(const Container& c) -> typename Container::value_type { return *c.begin(); } ``` 上述例子展示了如何访问容器对象 `Container` 所关联的具体元素类型 `_value_type` ,这里如果没有加上前缀 `typename` 就可能导致解析错误[^2]。 3. **特例情况下的选择** 对于一些特殊情形比如继承关系链路较长或者是模板元编程领域里频繁操作各种派生类别之时,往往也会倾向于选用 `typename` 形式的描述更加简洁易懂。 #### 总结对比表 | 特性 | `class` | `typename` | |--------------------|----------------------------------|--------------------------------| | 基本意义 | 表达的是面向对象中的类 | 明确指出后面跟着的东西是个类型 | | 应用范围 | 同样适用于所有可能成为模板参数的对象 | 推荐应用于较为复杂的上下文中 | | 编码风格偏好 | 较旧版本标准下常用 | 新一代编码指南提倡更多运用此选项 | 综上所述,虽然从技术角度来看二者并无本质上的不同之处,但在实际开发过程中遵循一定的规范有助于提高代码可读性维护效率[^5]。 ```cpp // 示例代码展示两种写法互换的可能性 #include <iostream> template <class T> // 或者 template <typename T> void printValue(T value){ std::cout << "The Value is : "<< value<<std::endl; } int main(){ int num=42; double pi=3.14; printValue<int>(num); // 输出 The Value is : 42 printValue<double>(pi); // 输出 The Value is : 3.14 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值