模板元编程之关键字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/

posted @   TechNomad  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2022-06-30 Inno Setup 入门 (一)—— Inno Setup打包
点击右上角即可分享
微信分享提示