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

浙公网安备 33010602011771号