これは、テンプレートのインスタンス化がどのように機能するかについての単純化された、骨抜きにされたバージョンです(foldのBoostドキュメントを調べます)。
あなたがC++コンパイラであり(あなたを呼びましょうclang
...それはかなりクールな名前です)、.cpp
それをコンパイルするためにファイルを楽しく読んでいるとしましょう。void foo()
、、float magic(int x, double p)
などの通常の機能がすべて表示されint main(int argc, char** argv)
ます。次に、次のようなものに出くわします。
template <typename T>
struct is_fun
{
typedef some_other_type<T> something_else;
typedef typename something_else::value value;
}
ここで、次のように述べています。かっこいい、パラメータとして単一のタイプを持つテンプレートである、clang
という名前のこの構造について知っています。is_fun
この時点で、is_fun
は初期化されていないテンプレートです。ここでは何もコンパイルしていないことに注意することが重要です。テンプレート化されたclang
ものを見ると、構文を(可能な範囲で)チェックして次に進みます。初期化されていないテンプレートをオブジェクトコードで出力する方法はありません。これは純粋にC++であり、コンパイルされていません。
後で、それがやって来て、is_fun
次のようなステートメントで使用されるのを確認します。
typedef vector<long,float,short,double,float,long,long double> types;
typedef fold<
types,
int_<0>,
if_< is_fun<_2>,next<_1>,_1 >
>
::type number_of_fun;
さて、clang
怠惰で、「さて、number_of_fun
それはその恐ろしいものの単なる別名です」とだけ言います。繰り返しますが、それは何もしません。コードの後半で、次のように表示されます。
int foo()
{
const int fun = number_of_fun::value;
return fun;
}
今number_of_fun
、それはテンプレートで何かをしました。これで、テンプレートパラメータに値が入力されます(使用するには値number_of_fun::value
が必要なため)。 clang
すべてのBoostのものをステップスルーし、最終的にはテンプレート化されたものになりますis_fun
。リストで最初に必要なのは(ベクトルの折りたたみが行うことです)であるため、すべてのsが入力されlong
たlongに基づいて新しい型が作成されます。T
struct is_fun<long>
{
typedef some_other_type<long> something_else;
static const int value = typename something_else::value;
}
このタイプは使用されているため、コンパイルされます。C ++テンプレートの基本的なルールは次のとおりです。コンパイル中に使用すると、インスタンス化されます。つまり、コンパイルされます。実行時に行う必要のある特別なことは何もありません。