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 を使うとエラーになるのですか?

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

すべて明確でしたか?

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

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

セクション 4.  1

AIに質問する

expand

AIに質問する

ChatGPT

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

セクション 4.  1
some-alt