Gabarito de função C ++ (2) A diferença entre funções comuns e gabaritos de função, as regras de chamada de funções comuns e gabaritos de função e as limitações dos gabaritos

Template de função C ++ (2)

Ontem acabei de resolver o modelo de função C ++ (1), e você deve segui-lo hoje. Hoje, vou continuar a organizar as notas do modelo de função C ++. Hoje, organizarei principalmente - a diferença entre funções comuns e modelos de função, as regras de chamada de funções comuns e modelos de função e as limitações dos modelos. Não fale bobagem, corra!

05 A diferença entre a função comum e o modelo de função
1. A conversão automática de tipo (conversão implícita de tipo) pode ocorrer quando a função comum é chamada
2. O modelo de função, a inferência automática de tipo e a conversão implícita de tipo não podem ocorrer.
3. Gabarito de função, use a exibição para especificar o tipo, a conversão de tipo implícita pode ocorrer.
A implementação do código específico é a seguinte:

#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;
}

Observação: é recomendável usar o método de exibição do tipo especificado e chamar o modelo de função, porque você mesmo determina o tipo geral T.

06 Regras para chamar funções comuns e modelos de função
1. Se ambos os modelos de função e funções comuns podem ser implementados, chame as funções comuns primeiro.
2. O modelo de função pode ser forçado a ser chamado por meio da lista de parâmetros de modelo vazia.
3. Os modelos de função também podem ser sobrecarregados.
4. Se o modelo de função pode produzir uma correspondência melhor, chame o modelo de função primeiro.

#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;
}

Nota: Forneça modelos de função, não escreva funções comuns para evitar ambigüidade.

07 Limitações dos
modelos A versatilidade dos modelos não é uma panacéia.Alguns tipos de dados específicos requerem implementações especiais, como chamadas de tipo de dados bool e alguns tipos de dados personalizados, como Pessoa.
O teste de caso de função é o seguinte:

#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;
}

Nota:
1. Como o caractere é definido char c1 = 'a'; char c2 = 'b'.
2. Classes como Pessoa \ Classe devem ser adicionadas no final; do contrário, ocorrerão erros inesperados.
3. O uso de modelos específicos pode resolver a generalização de tipos personalizados.
4. Modelos de aprendizagem não é escrever modelos, mas usar os modelos fornecidos pelo sistema em STL para atender às nossas necessidades.

Acho que você gosta

Origin blog.csdn.net/qq_45252077/article/details/107895214
Recomendado
Clasificación