[英]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.