这里以找出两个vector数组中相同的元素为例。
//patternFun.h
#include <iostream>
#include <vector>
using namespace std;//不可省
//声明区
template<typename T>
vector<T>intersection1(const vector<T>& v1, const vector<T>& v2);
template <typename T>
vector <T> intersection2(const vector<T>& v1, const vector<T>& v2);
template <>
vector<string> intersection2 <string>(const vector<string>& v1, const vector<string>& v2);
//定义区
template<typename T>
vector<T>intersection1(const vector<T>& v1, const vector<T>& v2)
{
int t1 = v1.size();
int t2 = v2.size();//也可以不创建t3,t4直接将三目表达式写到t3,t4的位置,但是记得拿括号整个括起来。
vector<T>v3(t1);
if constexpr (is_same<T, string>::value)
{
for (int i = 0, t = 0; i < t1; i++)
{
for (int j = 0; j < t2; j++)
{
if ((v1[i].compare(v2[j])) == 0)
{
v3[t++] = v1[i];
}
}
}
}
else
{
for (int i = 0, t = 0; i < t1; i++)
{
for (int j = 0; j < t2; j++)
{
if (v1[i] == v2[j])
{
v3[t++] = v1[i];
}
}
}
}
return v3;
}
template <typename T>
vector <T> intersection2(const vector<T>& v1, const vector<T>& v2)
{
int t1 = v1.size();
int t2 = v2.size();
vector<T>v3(t1);
for (int i = 0, t = 0; i < t1; i++)
{
for (int j = 0; j < t2; j++)
{
if (v1[i] == v2[j])
{
v3[t++] = v1[i];
}
}
}
return v3;
}
template <>
vector<string> intersection2 <string>(const vector<string>& v1, const vector<string>& v2)
{
int t1 = v1.size();
int t2 = v2.size();
vector<string>v3(t1);
for (int i = 0, t = 0; i < t1; i++)
{
for (int j = 0; j < t2; j++)
{
if ((v1[i].compare(v2[j])) == 0)
{
v3[t++] = v1[i];
}
}
}
return v3;
}
//Test.cpp
#include <string>
#include <string.h>
#include <type_traits>
#include"patternFunc.h"
using namespace std;
int main()
{
int t1, t2;
cout << "分别输入两个向量中的元素个数:";
cin >> t1 >> t2;
vector<string>v1(t1);
vector<string>v2(t2);
vector<string>v3((t1<t2)?t1:t2);
cin.ignore(numeric_limits<streamsize>::max(), '\n');
for (int i = 0; i < 2; i++)
{
if(i==0)
{
cout << "输入第一个向量:" << endl;
for (int j = 0; j < t1; j++)
{
cout << "输入第" << j + 1 << "个元素:";
getline(cin, v1[j]);
}
}
if (i == 1)
{
cout << "输入第二个向量:" << endl;
for (int j = 0; j < t2; j++)
{cout << "输入第" << j + 1 << "个元素:";
getline(cin, v2[j]);
}
}
}
/*vector<int>v1(t1); //Test2
vector<int>v2(t2);
vector<int>v3((t1 < t2) ? t1 : t2);
for (int i = 0; i < 2; i++)
{
if (i == 0)
{
cout << "输入第一个向量:" << endl;
for (int j = 0; j < t1; j++)
{
cout << "输入第" << j + 1 << "个元素:";
cin >> v1[j];
}
}
if (i == 1)
{
cout << "输入第二个向量:" << endl;
for (int j = 0; j < t2; j++)
{
cout << "输入第" << j + 1 << "个元素:";
cin>>v2[j];
}
}
}*/
v3 = intersection1(v1, v2);
cout << "相同的元素有:" << endl;
for (int i = 0; i < ((t1 < t2) ? t1 : t2); i++)
{
cout << v3[i] << endl;
}
return 0;
}
注意一13-14行对模板函数进行了显式具体化,但是显示具体化不同于一般的函数重载,可以这么理解:
template <typename T>
vector <T> intersection2(const vector<T>& v1, const vector<T>& v2);
对于每个传入的类型T,都有实例化就想template vector<int>intersection2<int>(const vector<T>& v1, const vector<T>& v2);是主动对T=int 的情况生成函数实例。但是显式实例化原则:T=typename时,原来模板声明所有T都要换成typename,其余地方不允许更改!
注意二
LNK2019错误对于模板函数来说,是因为声明与定义不都在.h中,比如定义在.cpp中,目前只有这一种方法,即使在main.cpp中包含.cpp也无济于事,而且与普通函数的.h-.cpp-main.cpp不同,多个源文件包含.h并不会出现重复定义的问题!