若两个函数的逻辑相同,但参数类型不同,则可以把这2个函数合并为一个模板函数,有利于精简代码和提高可读性。
比如,
- 函数A: 将CString的三个动态数组:vector<CString> left,mid,right合并为一个;
- 函数B: 将double的三个动态数组:vector<double> left,mid,right合并为一个;
函数A、B的功能都是合并3个vector,只有函数参数不同,则可以用模板函数来代替原始的A、B,代码更加简洁,具体如下:
1 原始函数
1.1 将3个CString类型的vector<>合并
void MergeData(vector<CString>& data,const vector<CString>& left, const vector<CString>& mid, const vector<CString>& right)
{
data.insert(data.end(), left.begin(), left.end());
data.insert(data.end(), mid.begin(), mid.end());
data.insert(data.end(), right.begin(), right.end());
}
1.2 将3个double类型的vector<>合并
void MergeData(vector <double>& data, const vector<double>& left, const vector<double>& mid, const vector<double>& right)
{
data.insert(data.end(), left.begin(), left.end());
data.insert(data.end(), mid.begin(), mid.end());
data.insert(data.end(), right.begin(), right.end());
}
2 升级为模板函数
template <typename T>
inline void MergeData(vector<T>& data, const vector<T>& left, const vector<T>& mid, const vector<T>& right)
{
data.insert(data.end(), left.begin(), left.end());
data.insert(data.end(), mid.begin(), mid.end());
data.insert(data.end(), right.begin(), right.end());
}
3 测试方法
//test.cpp
//模板函数
template <typename T>
inline void MergeData(vector<T>& data, const vector<T>& left, const vector<T>& mid, const vector<T>& right)
{
data.insert(data.end(), left.begin(), left.end());
data.insert(data.end(), mid.begin(), mid.end());
data.insert(data.end(), right.begin(), right.end());
}
//测试函数
void TestMerge1()
{
//1)字符串
vector<CString> data;
vector<CString> left = { _T("dx1"),_T("dy1"),_T("dz1") };
vector<CString> mid = { _T("dx2"),_T("dy2"),_T("dz2") };
vector<CString> right = { _T("dx3"),_T("dy3"),_T("dz3") };
MergeData(data, left, mid, right);
CString strLine;
for (int i = 0; i < (int)data.size(); i++)
{
strLine += data[i] + _T(" ");
if (i == data.size() - 1)
{
strLine += _T("\r\n");
OutputDebugString(strLine);
}
}
//2)数据
vector<double> data2;
vector<double> left2 = { 110,120,130 };
vector<double> mid2 = { 310,320,330 };
vector<double> right2 = { 510,520,530 };
MergeData(data2, left2, mid2, right2);
CString strRow;
for (int i = 0; i < (int)data2.size(); i++)
{
CString strItem;
strItem.Format(_T("%.2lf"), data2[i]);
strRow += strItem + _T(" ");
if (i == data2.size() - 1)
{
strRow += _T("\r\n");
OutputDebugString(strRow);
}
}
}
效果如下: