代码之家  ›  专栏  ›  技术社区  ›  Tony The Lion

C++模板“延迟实例化”

  •  6
  • Tony The Lion  · 技术社区  · 15 年前

    C++模板中的“延迟实例化”是什么意思?

    2 回复  |  直到 15 年前
        1
  •  10
  •   Benoît photo_tom    15 年前

    延迟实例化是在第一次使用相应的实体之前不实例化模板的情况。例如,您有一个模板函数:

    template<int Size>
    void YourFunction()
    {
        //does something
    }
    

    参数 Size int 我可以有。是否自动为所有可能的值实例化模板化函数 大小

    YourFunction<100>(); //instantiated for 100
    
        2
  •  4
  •   Johannes Schaub - litb    15 年前

    template<typename T>
    struct A {
      void f() {
        T a; // invalid if T is void
      }
    };
    
    A<void> a; // valid!
    

    在这种情况下, A<void> 是隐式实例化的,因为编译器需要知道它的大小(形式上,类类型需要完整,因此会触发实例化)。但是它的实例 推迟 直到它们真正被使用。这不仅适用于成员函数,也适用于静态数据成员和嵌套类

    struct Print {
      Print() { std::cout << "hello!"; }
    };
    
    template<typename T>
    struct A {
      static Print print;
    };
    
    template<typename T>
    Print A<T>::print;
    

    现在即使隐式实例化 A<T> 在您明确引用之前,不会打印消息 A<T>::print 使用

    template struct A<void>;
    

    不过,有一个技巧可以触发隐式实例化的成员定义的实例化:在类成员的声明部分引用它们,就像下面更改的类模板一样

    template<typename T, T&> struct useit { };
    
    template<typename T>
    struct A {
      static Print print;
      typedef useit<Print, print> useit_type;
    };
    

    现在如果 消息被隐式实例化,因为typedef声明引用了它。