簡體   English   中英

C ++模板“延遲實例化”

[英]C++ template “deferred instantiation”

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

延遲實例化是指模板未實例化,直到第一次使用相應的實體。 例如,您有一個模板化的函數:

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

參數Size可以具有int可以具有的任何可能值。 您是否自動為所有可能的Size值實例化了模板化函數? 不,模板僅實例化為函數調用首次出現在代碼中時實際用作參數的值:

YourFunction<100>(); //instantiated for 100

我只聽過人們使用術語“延遲實例化”來指代僅在使用類成員定義時才實例化它的情況

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

現在,如果隱式實例化A<T> ,則打印消息,因為typedef聲明引用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM