2017-03-03 19 views
4

テンプレートを使用してパラメータを送信する目的はありますか?もしそうなら、内部スタックを介してパラメータを送信することとはどのように違いますか?例:C++:テンプレートを介して引数を関数のパラメータに渡すこと

C++、ボリューム1、第2版の中に考えるブック
template<int argument> 
void myMethod(){//Do something with *argument* }; 

void myMethod(int argument){//Do something with *argument* }; 

、深さの章テンプレートの下に、非程度のみいくつかの単語がありますテンプレートの引数を入力すると、私は彼らの目的を十分に理解していないと感じています。

編集:ありがとうございます。もし可能であれば、私はお互いを補完するので、両方の答えに印をつけます。

+1

テンプレート引数異なる種類があり、コンパイル時定数です。たとえば、 'argument'がテンプレートの場合、' std :: array 'というステートメントでそれを使うことができます。 –

答えて

1

テンプレートとの違いは、コンパイル時に値が決定され固定されることです。つまり、プログラムをコンパイルするときです。コンパイルが完了した後は、決してそれらを変更することはできません。永遠に定数と見なされます。だから、

、と:あなたはmyMethod<5>()を呼び出す場合

template<int argument> 
void myMethod(){//Do something with *argument* }; 

、その後、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 
    } 
} 
+0

これは 'constexpr'が強調しているように、少しうそですが、十分に真実です。 – Yakk

1

void myMethod(int argument){//Do something with *argument* }; 

引数は、実行時にMyMethodはに渡されるので、異なる値を渡すことができます。ここで

template<int argument> 
void myMethod(){//Do something with *argument* }; 

argumentテンプレートパラメータは、コンパイル時に渡されます。

クラス、すなわちで使用する場合

非型テンプレートパラメータは大きな意味を持つ。:

template<int N> 
class Test{}; 

typedef Test<1> test1_type; 
typedef Test<2> test2_type; 

static_assert(std::is_same<test1_type, test2_type>::value == false, ""); 

test1_typetest2_type

+0

2番目の例で '<タイプ引数>'がありません。 –

+0

@FabianKlötzlが修正されました – marcinj

関連する問題