テンプレート特殊化のイントロダクション
メニューを表示するにはスワイプしてください
一般的なテンプレートは、あらゆるデータ型に対応します。しかし、特定の型には特別な処理が必要な場合があります。例えば、int型とstd::string型で異なる動作をする関数を実装する場合、テンプレートの特殊化を利用することで、それぞれの型に対して異なるバージョンのテンプレートを定義できます。
main.cpp
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
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テンプレート関数のような問題に対応するためにテンプレートの特殊化を利用する必要があります。
すべて明確でしたか?
フィードバックありがとうございます!
セクション 4. 章 1
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください
セクション 4. 章 1