テンプレートを介してパラメータを送信する目的はありますか?もしそうなら、これは内部スタックを介してパラメータを送信することとどのように異なりますか?例:
void myMethod(int argument){//Do something with *argument* };
vs
template<int argument>
void myMethod(){//Do something with *argument* };
『Thinking in C ++』第1巻、第2版、「テンプレートの詳細」の章では、型以外のテンプレート引数についての単語がほんの少ししかなく、その目的を完全には理解していなかったと感じています。
編集:説明をありがとう。可能であれば、両方が互いに補完し合っているので、両方の回答にマークを付けます。
違いは、テンプレートの場合、値はコンパイル時に決定および修正されることです。つまり、プログラムをコンパイルするときです。コンパイルが完了した後でそれらを変更することはできず、それらは永久に定数と見なされます。
だから、と:
template<int argument>
void myMethod(){//Do something with *argument* };
を呼び出すmyMethod<5>()
と、の値argument
は常に5になり、実行時に関数には実質的に引数がありません。これで、を呼び出すmyMethod<6>()
と、コンパイラは同じ関数を別の定数値で再作成します。したがって、実行時に2つの関数があります。
一方、通常の方法では、実行時、つまりプログラムの実行中に変更できます。関数を再度呼び出すと、引数値が異なる同じコードが実行されます。
例:
template <int L>
void DoSomething()
{
int a[L]; //this works fine here! Becasue L is just a constant that is resolved at compile-time
for(int i = 0; i < L; i++)
{
//do stuff
}
}
void DoSomething(int L)
{
int a[L]; //this won't work, because L is a variable that can be set while the program is running
for(int i = 0; i < L; i++)
{
//do stuff
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加