C++中模板 template <typename T> 的解释

博客探讨了C++中的模板(template)特性,通过对比传统的方法,展示模板如何简化代码,实现类型无关的函数重用。使用template,可以创建一个通用的加法函数,避免为每种数据类型编写单独的函数,提高代码的可维护性和效率。

最近在看公司项目的源码,遇到了不少问题,一点一点进行补充。

首先就是遇到template 。

网上解释的非常多,觉得比较啰嗦,其实就是一个类型模板。

比如我们要计算两个数的加法,针对不同类型可能需要设计不同类型的函数,那么template 就可以很好的解决这个问题。

原始解决方法:

int sum(int a,int b);
double sum(double a,double b);
float sum(float a,float b);

但是当用template 后为:

template <typename T>
T sum(T a, T b)
{
  return a+b;
}

我们发现,代码变得简单了很多。

### C++ 模板中 `typename` 和 `class` 关键字的区别 在 C++ 中,`template <class T>` 和 `template <typename T>` 都用于定义模板参数,允许程序员编写与类型无关的代码。尽管它们的功能相似,但在使用和语义上存在细微差异。 #### 1. 历史背景与语法选择 在早期版本的 C++ 中,只有 `class` 可用于定义模板参数[^4]。随着语言的发展,引入了 `typename` 关键字作为 `class` 的替代品,以减少混淆并明确表示模板参数是一个类型名称[^1]。 #### 2. 语义上的区别 - **`class`**:传统上用于定义模板参数,可能让人误以为它仅适用于类类型(如结构体或类)。但实际上,`class` 同样可以用于基本数据类型(如 `int`、`float` 等)[^3]。 - **`typename`**:更明确地表明模板参数是一个类型名称,无论是类类型还是基本数据类型。因此,`typename` 被认为更具表达性,尤其是在现代 C++ 编程中[^4]。 #### 3. 使用场景 尽管两者在功能上没有本质区别,但推荐根据上下文选择合适的关键字: - 在模板定义中,`typename` 更加常用,因为它清晰地传达了参数是一个类型的意图[^1]。 - 如果模板参数确实是一个类类型(例如需要访问其成员或基类),则可以使用 `class`,但这更多是出于习惯或风格考虑。 #### 4. 示例代码 以下是一个简单的示例,展示了如何使用 `class` 和 `typename` 定义模板: ```cpp // 使用 class 定义模板 template <class T> void PrintValue(T value) { std::cout << "Value: " << value << std::endl; } // 使用 typename 定义模板 template <typename T> void PrintType() { std::cout << "Type: " << typeid(T).name() << std::endl; } ``` #### 5. 其他用途 除了用于定义模板参数外,`typename` 还有其他用途: - 在模板内部声明嵌套依赖类型时,必须使用 `typename` 来显式指定某个名称是类型[^4]。 ```cpp template <typename T> void PrintNestedType() { typename T::value_type value; // 必须使用 typename 表明 value_type 是类型 std::cout << "Nested type value: " << value << std::endl; } ``` #### 总结 `class` 和 `typename` 在模板参数定义中功能相同,但在现代 C++ 编程中,`typename` 更具表达性和推荐性。此外,`typename` 还可用于更复杂的模板编程场景,如嵌套依赖类型的声明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值