C++中typename的用法

前言

    最近在看STL源码剖析时,遇到关于typename的用法,平常接触到的只是在定义模板参数时使用,直到遇到这个问题我才彻底的查找了typename的用法。先看下一个例子:

typedef typename iterator_traits<_Iter>::value_type  value _type;
    我们可能对 typedef 很了解,即定义一个别名,其形式是: typedef +原类型名+新类型名;因此,我们可以知道typename iterator_traits<_Iter>::value_type 是类型名;但是感到困惑的是这里为什么要使用 typename 关键字?

typename的常规用法

        typenameC++类模板或者函数模板中经常使用的关键字,此时作用和class相同,只是定义模板参数;在下面的例子中,该函数实现泛型交换数据,即交换两个数据的内容,数据的类型由_Tp决定。

template <typename _Tp>
inline void swap(_Tp& __a, _Tp& __b) 
{
  _Tp __tmp = __a;
  __a = __b;
  __b = __tmp;
}

typename的第二个用法:修饰类型

    在介绍第二个用法之前先了解下一些基本概念,

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++20之前,C++语言并没有`export`关键字。而在C++20,`export`关键字被引入用于模板的分离编译。 在C++,模板的定义和实现通常都放在头文件,当使用模板时,编译器需要实例化并编译模板的定义和实现。如果有多个源文件都使用了同一个模板,那么模板的定义和实现就会被重复编译,这会导致编译时间的增加和二进制文件的增大。 通过使用`export`关键字,可以将模板的定义和实现分离开来,将实现部分放在一个单独的源文件,然后在使用模板的源文件通过`import`关键字引入该实现文件,这样就可以避免模板的重复编译,提高编译效率并减小二进制文件的大小。 下面是一个简单的示例: ```C++ // math.hpp export template<typename T> T add(T a, T b) { return a + b; } ``` ```C++ // math.cpp export module math; import <iostream>; export template<typename T> T add(T a, T b) { std::cout << "add() is called" << std::endl; return a + b; } ``` ```C++ // main.cpp import <iostream>; import math; int main() { std::cout << add(1, 2) << std::endl; return 0; } ``` 在上面的示例,`math.hpp`定义了一个`add`函数模板,`math.cpp`实现了`add`函数模板,并使用`export`关键字将其导出为`math`模块。`main.cpp`使用了`import`关键字引入了`math`模块,并调用了`add`函数模板。 需要注意的是,目前并不是所有的编译器都支持`export`关键字,而且`export`关键字的使用也需要遵循一定的规范,具体可以参考C++20的相关文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值