typename双重意义笔记

本文详细介绍了C++中模板的使用规范,特别是如何正确使用typename关键字来指涉嵌套从属类型名称,以及一些特殊情况下的使用规则。

// 具体请参考《Effective C++中文第三版》条款42::了解typename的双重意义

 

// 模板<template>

template内出现的名称如果相依于某个template参数,称为从属名称(dependent names);

如果从属名称在class内呈嵌套状,我们称它为嵌套从属名称(nested dependent name)。

 


// 一般性规则:任何时候当你想要在template中指涉一个嵌套从属类型名称,就必须在
// 紧邻它的前一个位置放上关键字typename。(有一个例外)
// 合法的C++代码
template<typename C>
void print2nd(const C& container)
{
 if(container.size() >= 2 )
 {
  typename C::const_iterator iter(container.begin());  // C::const_iterator为嵌套从属名称, C为从属名称
  ...
 }
}

// 不合法的C++代码
template<typename C>
void print2nd(const C& container)
{
 if(container.size() >= 2 )
 {
  C::const_iterator iter(container.begin());
  ...
 }
}

// typename必须作为嵌套从属类型名称的前缀词 这一规则的例外
// typename不可以出现在base classes list 内的嵌套从属类型名称之前,也不可在member initialization list (成员初值列)中作为base class 修饰符。
template<typename T>
class Derived:public Base<T>::Nested{  // base class list 中不允许“typename"
public:
 explicit Derived(int x)
 : Base<T>::Nested(x)       // member initialization list 中不允许"typename"嵌套从属类型名称
 {
  typename Base<T>::Nested temp; // 即不在base class list中也不在mem.init.list中, 作为一个base class修饰符需要加上typename
  ...  
 }


例:
 template<typename IterT>
 void workWithIterator(IterT iter)
 {
  typedef typename std::iterator_traits<IterT>::value_type value_type;
  value_type temp(*iter);
 }


请记住:
 1、声明template 参数时,前缀关键字class 和 typename 可互换
 2、请使用关键字typename标识嵌套从属类型名称;但不得在base class lists(基类列)或member initialization list(成员初值列)内以它作为base class 修饰符.

<think>我们面对的是一个名为"typeName"的查询。根据要求,我们需要进行网络搜索,整合信息,并生成符合规范的答案。 步骤1:理解问题 "typeName"可能指多种语境下的概念,例如: - 编程中:可能指类型名称(如在TypeScript、Java等语言中) - 数据库:可能指数据表中的类型名称 - 其他领域:如XML Schema中的typeName属性等 由于问题非常简短,需要进一步明确。但根据任务要求,我们需要根据用户意图和搜索词进行检索。 步骤2:进行网络搜索 由于问题较为宽泛,我们可能需要聚焦最常见的解释。在编程领域,"typeName"常出现在反射、类型系统中。 通过搜索,发现以下信息: - 在Java中,`java.lang.Class`类有一个方法`getTypeName()`,返回全限定类名的字符串。 - 在C#中,`Type.Name`属性获取类型的名称(不包括命名空间)。 - 在TypeScript中,类型别名(type)和接口(interface)都可以用来命名类型。 步骤3:整合信息 鉴于用户没有指定具体语言,考虑从多种语言中提取共性,并给出常见用法示例。 步骤4:生成答案 我们需要避免第一人称,避免步骤词汇,将答案组织为多个方法或步骤(每个步骤间换行)。如果有代码,按照要求格式。 答案结构: 第一部分:解释typeName的基本概念(在不同上下文中的含义) 第二部分:不同编程语言中的使用示例(代码示例) 第三部分:注意事项(如果有) 步骤5:相关问题 根据原始问题和回答内容,提出3个相关问题。 注意:必须严格按照格式要求,包括数学公式和代码的格式,以及最后的相关问题部分。 开始生成答案: </think>### 关于 typeName 的解释与应用 `typeName` 在不同技术领域中通常指代**类型名称**,用于标识变量、数据结构或对象的类型信息。以下是常见场景中的用法及示例: #### 1. 编程语言中的类型名称 在 Java、C# 等语言中,`typeName` 常作为方法或属性返回类型的字符串表示: ```java // Java 示例 Class<?> cls = String.class; String typeName = cls.getTypeName(); // 返回 "java.lang.String" ``` 在 TypeScript 中,`type` 关键字的别名定义: ```typescript // TypeScript 示例 type UserID = string; const id: UserID = "U123"; // typeName 为 UserID ``` #### 2. 数据库与 XML 中的类型标识 SQL 数据库利用 `type_name` 查询字段类型(MySQL 示例): ```sql SELECT COLUMN_NAME, DATA_TYPE AS type_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'users'; ``` XML Schema 中 `type` 属性定义元素类型: ```xml <xs:element name="email" type="xs:string"/> <!-- typeName 为 xs:string --> ``` #### 3. 反射与元编程 Python 的 `__name__` 属性获取类/函数类型名称: ```python class MyClass: pass print(MyClass.__name__) # 输出 "MyClass" ``` C# 通过 `typeof()` 和 `Name` 属性: ```csharp Type type = typeof(int); Console.WriteLine(type.Name); // 输出 "Int32" ``` #### 4. 注意事项 - **区分大小写**:Java/Python 中类型名称大小写敏感(`String` ≠ `string`)。 - **命名空间限定**:全限定名包含包/命名空间(如 `java.util.List`)。 - **动态语言差异**:JavaScript 的 `typeof` 返回基础类型(如 `"string"`),不适用于自定义类型。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值