模板元编程之关键字typename(四)
typename的常见用法
#include <iostream> template <typename T> T AddFunc(const T& a, const T& b) { return (a + b); } int main() { std::cout << AddFunc(10, 20) << std::endl; return 0; }
在上述的示例中,typename与class的作用是一致的,换句话说可以使用class替换typename。
在C++标准化过程中,引入关键字typename是为了说明:在模板内部的标志符可以是一个类型,如下述示例:
template <typename T> class MyClass { typename T::SubType* ptr; ... };
上面的示例中,内部的typename被用来说明SubType是定义于类T内部的一种类型,因此,ptr是一个执行T::SubType类型的指针,如果不使用typename,SubType就会被认为是一个静态成员,那么它应该是一个具体的变量或对象。于是T::SubType*ptr会被看作是类T的静态成员SubType和ptr的乘积,通常而言,当某个依赖于模板参数的名称是一个类型时,就应该使用typename。
使用字符串作为函数模板的实参
#include <iostream> #include <typeinfo> template <typename T> void ref(T const& x) { std::cout << "x in ref(T const&): " << typeid(x).name() << std::endl; } template <typename T> void nonref(T x) { std::cout << "x in nonref(T const&): " << typeid(x).name() << std::endl; } int main() { std::string s; ref("Hello"); nonref("Hello"); return 0; }
在main()函数中,分别传递一个字符串给具有引用参数的函数模板和具有非引用参数的函数模板,两个函数模板都使用了typeid运算符,来输出被实例化参数的类型。
打印结果:
参考:https://feihu.me/blog/2014/the-origin-and-usage-of-typename/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2022-06-30 Inno Setup 入门 (一)—— Inno Setup打包