部分テンプレート特殊化
メニューを表示するにはスワイプしてください
単一パラメータのテンプレートに対するテンプレート特殊化は簡単ですが、複数のパラメータがある場合はより複雑になります。ここで部分テンプレート特殊化が役立ちます。これは、特定の型や値のサブセットに対してテンプレートの特殊なバージョンを作成することを可能にします。
main.cpp
12345678// What if `T1` and `T2` are the same type? // Or what if you want to define special behavior when `T1` is a `std::string`? template<typename T1, typename T2> void TemplateExample(T1 first, T2 second) { std::cout << "Generic template!" << std::endl; }
部分テンプレート特殊化の構文
部分テンプレート特殊化はテンプレートのオーバーロードの一種と考えることができます。以下は守るべきルールです。
部分特殊化では、テンプレート関数の一部のパラメータを特定の型に固定し、他のパラメータを汎用のままにした新しいバージョンを定義します。コンパイラは、テンプレートのインスタンス化時に型が一致すると、この特殊化されたバージョンを使用します。
main.cpp
123456789101112131415#include <iostream> // Primary template template<typename T1, typename T2> bool IsSameType(T1 first, T2 second) { return false; } // Partial specialization for when both types are the same template<typename T> bool IsSameType(T first, T second) { return true; } int main() { std::cout << IsSameType(10, 'a') << std::endl; std::cout << IsSameType("Hello", "World") << std::endl; }
これはテンプレート特殊化の一つの使い方ですが、他にもより一般的なシナリオがあります。
main.cpp
123456789101112131415#include <iostream> // Primary template template <typename T1, typename T2> // General case void Template(T1 a, T2 b) { std::cout << "General" << std::endl; } // Partial specialization for when `T1` is `bool` template <typename T2> // Special case when the first type is `bool` void Template(bool a, T2 b) { std::cout << "Special" << std::endl; } int main() { Template(false, 25); Template(100, 300); }
すべて明確でしたか?
フィードバックありがとうございます!
セクション 1. 章 15
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください
セクション 1. 章 15