テンプレート特殊化のイントロダクション
メニューを表示するにはスワイプしてください
汎用テンプレートは、あらゆるデータ型に対応可能。ただし、特定の型には特別な処理が必要な場合がある。例えば、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テンプレート関数のような問題に対処するためにテンプレートの特殊化を使用する必要があります。
すべて明確でしたか?
フィードバックありがとうございます!
セクション 1. 章 13
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください
セクション 1. 章 13