Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ テンプレート特殊化のイントロダクション | イントロダクション
C++テンプレート

bookテンプレート特殊化のイントロダクション

メニューを表示するにはスワイプしてください

汎用テンプレートは、あらゆるデータ型に対応可能。ただし、特定の型には特別な処理が必要な場合がある。例えば、int型とstd::string型で異なる動作をする関数を実装する場合、テンプレートの特殊化によって各型ごとに異なるバージョンのテンプレートを定義できる。

main.cpp

main.cpp

copy
123456789101112
#include <iostream> template<typename T> T square(T value) { return value * value; } int main() { std::cout << square<int>(25); std::cout << square<std::string>("5"); }

上記のコードを実行すると、エラーが発生する。これは、std::string*演算子をサポートしていないためである。そのため、std::stringがパラメータとして渡された場合の処理方法をコンパイラに伝える必要がある。

テンプレートの内部動作

現時点では、テンプレート、特に関数テンプレートの基本を理解している段階です。テンプレートの作成方法、パラメータリストの使用方法、異なるデータ型で関数を呼び出す方法を学びました。この場合、なぜC++のすべての数値型に対して関数をオーバーロードしないのか疑問に思うかもしれません。この方法でもこの例には対応できますが、テンプレートははるかに強力なツールであることを忘れてはいけません。

main.cpp

main.cpp

copy
12345678910111213
#include <iostream> struct myStruct {}; class myClass {}; template<typename T> void TemplateFunction() { std::cout << typeid(T).name() << std::endl; } int main() { TemplateFunction<myClass>(); TemplateFunction<myStruct>(); }

テンプレートはユーザー定義型を含むあらゆるデータ型を受け入れることができます。一方、関数オーバーロードだけに頼る場合、型ごとに新しい関数を作成する必要があり、更新が煩雑でエラーが発生しやすくなります。そのため、関数オーバーロードだけに頼ることはできず、squareテンプレート関数のような問題に対処するためにテンプレートの特殊化を使用する必要があります。

question mark

なぜ例の square 関数テンプレートは std::string を使うとエラーになるのですか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 1.  13

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 1.  13
some-alt