zoukankan      html  css  js  c++  java
  • C++ typename关键字

    C++中typename关键字

    下面是摘自https://zh.cppreference.com/w/cpp/keyword/typename的描述

    C++中的typename关键字常见于模板使用

    例如:

      1. 代替class关键字

        template < typename T >

        这里typenameclass关键字的功能一样,是为了取代class关键字而生,原因是class用来代表非类类型时有点歧义,例如用class代表struct类型、int、double类型,这样显得不伦不类。

      2. 在模板中获取变量类型

        这个功能在C++标准库的萃取器里面经常出现

        示例1:

     1 template <class T>
     2 void foo() {
     3     typename T::iterator * iter;  // typename用于告诉编译器,T::iterator是一个类型而不是一个变量;否则编译器可能认为它是一个乘法操作
     4 }
     5 
     6 struct ContainsAType {
     7     struct iterator;
     8 };
     9 
    10 foo<ContainsAType>();

        示例2:

          template < typename T >

          class A {

          public:

            typedef int val_type;

          }

          typename A<T>::val_type var;   // var变量是A类里面的k变量的类型,这里等同于static int var;

          const typename A<T>::B& func();  // func()返回值是const A作用域下B类的引用

          typedef typename A<T>::B BType;  // 给A作用域下的B类 类型取一个别名为BType

          int func(typename A<T>::k var);    // func函数的参数是A::k类型(static int)

          template < typename T, typename Containter = std::deque<T> > class stack;

          上面的四个例子已经表示typename相当于获取变量的类型

     继承类的列表和参数初始化列表不能出现typename,因为编译器知道继承类的列表必须是类型,参数初始化列表必须是变量,例如:

     1 template<class T>
     2 class Derived: public Base<T>::XXX, public A<T>::YYY  // 父类列表,绝对是类型不可能是变量
     3 {
     4   ...
     5 }
     6 
     7 Derived(int x, int y) : Base<T>::XXX(x), A<T>::YYY(y)  // 参数初始化列表,绝对是变量而不可能是类型
     8 {
     9   ...
    10 }

  • 相关阅读:
    三国演义中的十大谎言 VS 程序员十大口头禅
    Node.js 的单线程事件驱动模型和内置的线程池模型
    为了让医院把医护还给患者,他们用了这个…
    华为云数据库内核专家为您揭秘:GaussDB(for MySQL)并行查询有多快?
    brew
    Python
    Python
    Python
    AtCoder Beginner Contest 215 (个人题解 A~F)
    AcWing 第 13 场周赛  补题记录
  • 原文地址:https://www.cnblogs.com/duacai/p/10896064.html
Copyright © 2011-2022 走看看