• 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 }

  • 相关阅读:
    SystemVerilog搭建测试平台---第一章:验证导论
    二线制I2C CMOS串行EEPROM续
    二线制I2C CMOS串行EEPROM
    Codeforces 777E:Hanoi Factory(贪心)
    2019HPU-ICPC-Training-1
    Codeforces 777B:Game of Credit Cards(贪心)
    Codeforces 777D:Cloud of Hashtags(暴力,水题)
    Codeforces 777C:Alyona and Spreadsheet(预处理)
    Codeforces 888D: Almost Identity Permutations(错排公式,组合数)
    Codeforces 888E:Maximum Subsequence(枚举,二分)
  • 原文地址:https://www.cnblogs.com/duacai/p/10896064.html
Copyright © 2020-2023  润新知