2012-05-09 9 views
3

今、私はテンプレートに精通しています。私はSFINAEのようなものに多少精通しています。そして、テンプレートがコンパイラによってインスタンス化されるときに何が起こるのか疑問に思っています。C++テンプレートのインスタンス化、正確にはどういう意味ですか?

あなたはTMPで物事を行うと、SFINAE、またはTMPでさえ簡単なフィボナッチ数列のように、それコンパイラは、私がテンプレートのインスタンスの下で理解し何よりもやっているように思えます。コンパイラはで、のテンプレートコードを実行しているようです。

私の質問は、正確にテンプレートのインスタンスと実際にコードを実行するコンパイラで描画された行はどこですか?

コンパイラはテンプレートの型を作成しますが、テンプレートのインスタンス化を理解しています。しかし、TMPでは、これ以上のことをしているようで、混乱しているようです。

+1

実行時に計算を実行するためにC++テンプレートを使用する方法を理解する方法の1つは、Prologの基本を学ぶことです。テンプレートメタプログラミングはPrologに典型的なプログラミングスタイルから大いに借りています。 – dasblinkenlight

+1

PROLOGとは全く関係がありません。それは、ハスケルをもっと連想させる機能的なスタイルです。 – Puppy

+0

@dasblinkenlight詳しいことはありますか?私は前にPrologを試してみたが、それは何も私に思い出させない。私は、TMPには型システムがないので、Haskellとの比較は非常に良いとは思わない。 – Pubby

答えて

3

これは実際には機能の束として考えるのが最善です。クラスTypeを考えてみましょう。ここでは、コンパイラの型の内部表現を表しています。

template<typename T> class X { 
    T t; 
}; 

のランタイムC++では、あなたはもちろん

Type* X(Type *t) { 
    static std::unordered_map<Type*, Type*> cache; 
    if (cache.find(t) != cache.end()) 
     return cache[t]; 
    Type* ret = new Type; 
    ret->DataMembers.insert("t", t); 
    return cache[t] = ret; 
} 

としてこれを表現することができ、少し余分を専門となどのために必要とされるであろう。しかし、このモデルを使用すると、2つのことは簡単です。

A)テンプレートのインスタンス化は、コンパイル時に発生する関数呼び出しと同じです(constexprのように)。もちろん、巧妙なコンパイラは最適化として何か他のことを行うかもしれませんが、一般的なケースではそうです。

B)テンプレートによって提供される他の機能に拡張する方法。

テンプレートをインスタンス化するのはTuring-completeなので、実際には他の方法で処理することはできません。コンパイラが実行しているように見える理由は、であるためです。彼らは、シンタックスの悪い限られたEDSL内の機能にすぎません。

+0

これは、実行時のC++との相性が良い方法です。 –

関連する問題