[c++]テンプレートアドバンス


序文

テンプレートパラメータは、型パラメータを非型パラメータに分類します。タイプパラメータは、テンプレートパラメータリストに表示されるパラメータタイプ名であり、その後にクラスまたはタイプ名が続きます。非型パラメーターは、クラス(関数)テンプレートのパラメーターとして定数を使用することです。これは、クラス(関数)テンプレートの定数として使用できます。

1.テンプレートパラメータ

問題の一部を解決する非型テンプレートパラメータへの参照、

  1. 浮動小数点数、クラスオブジェクト、および文字列は、型以外のテンプレートパラメータとして使用できません。
  2. 非型テンプレートパラメータには、コンパイル時の確認結果が必要です。
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ファイルにあります。このように、コンパイル時に彼の機能のアドレスが確認されているためです。


要約する

高度なテンプレートはこちらです!

おすすめ

転載: blog.csdn.net/weixin_52344401/article/details/121651105
おすすめ