C ++関数テンプレート(2)通常の関数と関数テンプレートの違い、通常の関数と関数テンプレートの呼び出し規則、およびテンプレートの制限

C ++関数テンプレート(2)

昨日はC ++関数テンプレート(1)を整理したので、今日はそれに固執する必要があります。今日は、C ++関数テンプレートのメモを整理し続けます。今日は、主に、通常の関数と関数テンプレートの違い、通常の関数と関数テンプレートの呼び出し規則、およびテンプレートの制限について説明します。ナンセンスな話をしないで、急いで!

05通常の関数と関数テンプレートの違い
1.通常の関数を呼び出すと、自動型変換(暗黙の型変換)が発生します
。2。関数テンプレート、自動型推論、暗黙の型変換は発生しません。
3.関数テンプレート。displayを使用して型を指定します。暗黙的な型変換が発生する可能性があります。
具体的なコードの実装は次のとおりです。

#include<iostream>
using namespace std;
//普通函数 减法
int  Sub(int a,int b)
{
    
    
	return(a-b);

}

//写一个模板函数
template<class T>
T Sub01(T a,T b)
{
    
    
     return (a-b);
}

//写一个输出函数
void test01()
{
    
    
    int a=100;
	int b=200;
	char c= 'c';

	cout<<Sub(a,c)<<endl;
	//自动类型推导输出
	//cout<<Sub01(a,c)<<endl; 自动类型推导不可以发生隐式类型转换
	//显示指定类型
	cout<<Sub01<int>(a,c)<<endl;
}

int main()
{
    
    
	test01();

system("pause");
return 0;
}

注:一般的な型Tは自分で決定するため、指定した型を表示して関数テンプレートを呼び出す方法を使用することをお勧めします。

06共通関数と関数テンプレートの呼び出し規則
1.関数テンプレートと共通関数の両方を実装できる場合は、最初に共通関数を呼び出します。
2.関数テンプレートは、空のテンプレートパラメータリストから強制的に呼び出すことができます。
3.関数テンプレートもオーバーロードできます。
4.関数テンプレートがより適切な一致を生成できる場合は、最初に関数テンプレートを呼び出します。

#include<iostream>
using namespace std;
//1、如果函数模板和普通函数同时调用,则优先调用普通函数

//先来一个普通函数
void myfunc(int a,int b)
{
    
    
cout<<"This is ordinary func"<<endl;
}

//再来一个模板函数
template<typename T>
void myfunc(T a,T b)
{
    
    
cout<<"This is 模板函数"<<endl;

}

//再来一个函数重载
template<typename T>
void myfunc(T a,T b,T c)
{
    
    
cout<<"This is 重载模板函数"<<endl;

}

//写一个输出函数
void test01()
{
    
    
int a=10;
int b=20;
//myfunc(a,b);

//通过空模板参数列表来,强制调用函数模板
//myfunc<>(a,b);

//函数重载的调用
//myfunc<>(a,b,0);

//如果函数模板可以产生更好的匹配,优先调用函数模板
char c1='a';
char c2='b';

myfunc<>(c1,c2);//这是因为,输入的是字符,如果是调用普通函数需要进行隐式转换,即把字符转换为int数字,而调用模板的只用推导出T即可不用进行转换。
}**加粗样式**
//模板的话自动类型推导,不可以发生隐式类型转换。显示指定类型的话可以发生隐式转换。

int main()
{
    
    

	test01();

system("pause");
return 0;
}

注:関数テンプレートを提供します。あいまいさを避けるために通常の関数を記述しないでください。

07
テンプレートの制限テンプレートの汎用性は万能薬ではありません。特定のデータ型の中には、boolデータ型の呼び出しなどの特別な実装や、Personなどのカスタムデータ型が必要なものがあります。
関数ケーステストは次のとおりです。

#include<iostream>
using namespace std;
#include<string>
//函数的局限性,函数的通用性不是万能的
//有些特定的数据类型需要用具体话的方式来实现
//整一个自定义数据类型的对比
class Person
{
    
    
public:
	Person(string name,int age)
	{
    
    
		this->m_name=name;
		this->m_age=age;
	}

//姓名
string m_name;
//年龄
int m_age;
};

//1、比较两个数据的大小
template<class T>
bool Contrast(T &a,T &b)
{
    
    
if(a==b)
{
    
    
return true;
}
else
{
    
    
return false;
}

}

//利用具体化Person的版本实现代码,具体化优先调用
template<> bool Contrast(Person &p1,Person &p2)
{
    
    
	if(p1.m_name == p2.m_name && p1.m_age==p2.m_age)
	{
    
    
	return true;
	}
	else
	{
    
    
	return false;
	}

}

//写一个测试输出函数
void test01()
{
    
    
int a=10;
int b=20;

bool ret=Contrast(a,b);
if(ret)
{
    
    
cout<<"a==b"<<endl;
}
else
{
    
    
cout<<"a!=b"<<endl;
}
}

//再写一个自定义类的输出函数
void test02()
{
    
    
Person p1("wjx",20);
Person p2("wjx",20);

bool ret=Contrast(p1,p2);
if(ret)
{
    
    
cout<<"p1==p2"<<endl;
}
else
{
    
    
cout<<"p1!=p2"<<endl;
}
}
int main()
{
    
    
	test01();
	test02();

system("pause");
return 0;
}

注:
1。文字の定義方法char c1 = 'a'; char c2 = 'b'。
2. Person \ Classなどのクラスを最後に追加する必要があります。追加しないと、予期しないエラーが発生します。
3.特定のテンプレートを使用すると、カスタムタイプの一般化を解決できます。
4.テンプレートの学習は、テンプレートを作成することではなく、STLのシステムによって提供されるテンプレートを使用してニーズを満たすことです。

おすすめ

転載: blog.csdn.net/qq_45252077/article/details/107895214