高度なテンプレート
序文
テンプレートパラメータは、型パラメータを非型パラメータに分類します。タイプパラメータは、テンプレートパラメータリストに表示されるパラメータタイプ名であり、その後にクラスまたはタイプ名が続きます。非型パラメーターは、クラス(関数)テンプレートのパラメーターとして定数を使用することです。これは、クラス(関数)テンプレートの定数として使用できます。1.テンプレートパラメータ
問題の一部を解決する非型テンプレートパラメータへの参照、
- 浮動小数点数、クラスオブジェクト、および文字列は、型以外のテンプレートパラメータとして使用できません。
- 非型テンプレートパラメータには、コンパイル時の確認結果が必要です。
namespace ljh
{
// 定义一个模板类型的静态数组
template<class T =int, size_t N = 10>
class array
{
private:
T _array[N];
size_t _size;
}
}
int main()
{
ljh::array<int,100> s1;
ljh::array<int,70> s2;
}
上記の状況と同様に、2つのスタックが異なるスペースを開く必要がある場合、テンプレートパラメーターがない場合は、2つのクラスを作成する必要があります。
完全なデフォルトクラスの場合は、ljh :: array<>s1;も呼び出す必要があります。
テンプレートの特殊化
いつ使う必要がありますか?
Is_empty関数を実装して、2つの値が同じかどうかを判断する場合。ただし、さまざまなタイプをさまざまな方法で比較できるため、現時点では特殊化を使用することも、テンプレートの一致原則を使用することもできます。
template<class T>
bool Is_empty(T left,T right)
{
cout << "hah" << endl;
return left == right;
}
template<>//特化
bool Is_empty<char*>(char* left,char* right)
{
return strcmp(left,right) == 0;
}
//模板的匹配原则
bool Is_empty(char* left,char* right)
{
return strcmp(left,right) == 0;
}
int main()
{
int left = 0;
int right = 0;
//cout << Is_empty(left, right)<<endl;
char str1[] = "woaini";
char str2[] = "woaini";
cout<<typeid(str1).name()<<endl;
cout << Is_empty(str1, str2) << endl;
return 0;
}
ここでのstr1とstr2は基本的に配列名であることに注意してください。パラメータを渡すときは型変換があります。したがって、上記のパラメータ受け渡しプロセスでテンプレート関数を次のconst T&に変更すると、専用バージョンで問題が発生します。
template<class T>
bool Is_empty(const T& left,const T& right)//error!
{
cout << "hah" << endl;
return left == right;
}
template<>
bool Is_empty<char*>(char* left,char* right)
{
return strcmp(left,right) == 0;
}
第二に、個別のコンパイル
1.ライブラリをインポートします
解決策1:インスタンス化を明示的に指定します。
解決策2:コンパイルを分離しないでください。宣言と定義は.hファイルにあります。このように、コンパイル時に彼の機能のアドレスが確認されているためです。
要約する
高度なテンプレートはこちらです!!