2011-08-14 14 views
1

Im + +のプライマープラスを読んで、暗黙的なインスタンス生成の仕組みを理解するいくつかの問題があります。私はまだクラスを学んでいませんので、私は関数を扱っています。私は暗黙のインスタンス(関数テンプレート)の基礎を理解していると思うが、私は明示的なインスタンス化を理解していない。テンプレートを使用する関数の下に、明示的なインスタンス化を使用すると、このような関数がどのように記述されるかを誰かに示すことができます。あなたはそれが動作する方法を変更することができますが、単純なままにしておきます。私は本当に感謝しています。これは、構文とその使用方法を理解するのに役立ちます。コピーに似たコード生成/あなたが具体的な形でTを交換ペーストなどのテンプレートのC++明示的なインスタンス化 - 関数テンプレート - 暗黙のインスタンス化を置き換えて学習する

2 #include <iostream> 
    3 
    4 template <typename T> 
    5 void show(T,T); 
    6 
    7 
    8 int main() 
    9 { 
10 int a = 10, b = 12; 
11 char c = 'x', d = 'y'; 
12 
13 show(a,b); 
14 show(c,d); 
15 
16 return 0; 
17 } 
18 
19 template <typename T> 
20 void show(T a, T b) 
21 { 
22 std::cout << "I used the int version " << a << " " << b << "\n"; 
23 } 
+0

申し訳ありませんが、私はそれをたくさんしゃべっていました。私はそれを私の例に入れて忘れました。代わりに、この関数を明示的なインスタンス化に変換する方法を知っていますか?これを表示するために私の機能を編集しました –

答えて

3

はちょうど私が明示的にintバージョンをインスタンス化しますが、charパラメータを渡すましShow<int>(c, d)お知らせください。それは明示的なインスタンス化ではなく、実際にexplicit specializationを参照している可能性があります。

+0

テンプレートテンプレートには存在しないので、彼はテンプレートの特殊化について話すことはできません。 – PierreBdR

+0

@PierreBdR - あなたが正しいです、*明示的な専門化*は私が探していたものです。編集されました。私はそのようなことが存在していたことを知っていましたが、それが何と呼ばれていたのか忘れました... – Schnommus

+0

@ Schnommus - どちらも明示的なインスタンス化と呼ばれていません。ここでも、関数テンプレートの特殊化は存在しません。 – PierreBdR

0

と思います。インスタンシエーションとは、プログラムにコードをコピーして貼り付けるプロセスです。

テンプレートを使用すると、暗黙的なインスタンス化が行われます。関数テンプレートの場合、具体的な型は関数の引数から導出され、テンプレートはその型に対してインスタンス化されます。だから、あなたのコードが有効になった:

void show(int a, int) { std::cout << "I used the int version " << a << " " << b << "\n"; } 
void show(char a, char) { std::cout << "I used the int version " << a << " " << b << "\n"; } 

int main() { /* as it was */ } 

明示的なインスタンス化、一方で、単に明示的にコードを生成するようにコンパイラーに強制します。私たちはあなたのコードに明示的なインスタンス

template void show(double, double); 

を追加した場合、コンパイラは、対応するコードを生成し、

void show(double a, double) { std::cout << "I used the int version " << a << " " << b << "\n"; } 

は、これはあなたが実際にそのコードを使用するかどうかに関係なく起こるでしょう。


クラステンプレートのインスタンス化がはるかに微妙であるので、あなたは、あなたが楽しいの92%を逃している、クラスを知っていない場合。実際に使用されているメンバ関数だけが暗黙的にインスタンス化され、明示的なインスタンス化によってすべてのクラスメンバのコードが生成されます。また、クラスメンバ関数は、実際にインスタンス化されるまではある程度正確さがチェックされないので、すべての可能な型に対して実際には意味をなさないテンプレートを書くことができます。

0

はあなたがintための(明示的なインスタンス化を参照してください)特殊化を意味している場合、それをすることができますよう:

show<int>(a,b); 
:あなたは本当にその後、明示的なインスタンス化を行いたい場合は

template <typename T> 
void show(T,T); 

template <> // specialization (not overloading) for 'int' 
void show(int a, int b) 
{ 
    std::cout << "I used the int version " << a << " " << b << "\n"; 
} 

それは次のように行うことができます

実際にはこの場合実際には冗長です。

+0

これは間違っています。あなたはテンプレートの特殊化について話していますが、テンプレート関数には存在しません。あなたのコードは実際には間違っています。 – PierreBdR

+0

@PierreBdR、[コードは正しい](http://www.ideone.com/TzB8x)のみ。 'template'特殊化は' template'関数のために存在します。なぜあなたはそれが正しくないと感じますか? – iammilind

+1

申し訳ありませんが、私は部分的な専門と混同しました。また、私は、機能の専門化が有用であるケースを見たことはありません。 – PierreBdR

0

関数を明示的にインスタンス化するには、型を明示的に指定する必要があります。あなたの例では、showへの呼び出しを次のように置き換えます。

show<int>(a,b); 
show<char>(c,d); 

これはそれです。暗黙のインスタンス化は、コンパイラが引数の型からintcharを見つけることができることを意味します。

関連する問題