我是一个函数原型:
void writeToFile(ofstream&, vector<SoftwareDeveloper>, vector<Manager>, vector<Tester>, vector<TeamLeader>);
和函数体:
void writeToFile(ofstream& fileToBeWrittenTo, vector<SoftwareDeveloper> firstArray, vector<Manager> secondArray, vector<Tester> thirdArray, vector<TeamLeader> fourthArray)
{
for (int i = 0; i < firstArray.size(); i++)
{
fileToBeWrittenTo << firstArray[i].identificationCode << "|" << firstArray[i].firstName << "|" << firstArray[i].lastName << "|" << firstArray[i].typeOfEmployee << "|";
for (int j = 0; j < firstArray[i].knownLanguages.size(); j++)
fileToBeWrittenTo << firstArray[i].knownLanguages[j] << ':';
fileToBeWrittenTo << endl;
}
for (int i = 0; i < secondArray.size(); i++)
{
fileToBeWrittenTo << secondArray[i].identificationCode << "|" << secondArray[i].firstName << "|" << secondArray[i].lastName << "|" << secondArray[i].typeOfEmployee;
fileToBeWrittenTo << endl;
}
for (int i = 0; i < thirdArray.size(); i++)
{
fileToBeWrittenTo << thirdArray[i].identificationCode << "|" << thirdArray[i].firstName << "|" << thirdArray[i].lastName << "|" << thirdArray[i].typeOfEmployee << "|" << thirdArray[i].isAutomated;
fileToBeWrittenTo << endl;
}
for (int i = 0; i < fourthArray.size(); i++)
{
fileToBeWrittenTo << fourthArray[i].identificationCode << "|" << fourthArray[i].firstName << "|" << fourthArray[i].lastName << "|" << fourthArray[i].typeOfEmployee;
fileToBeWrittenTo << endl;
}
};
我是否可以使用模板使函数获得多种类型的结构,我的意思是,只需用vector<SoftwareDeveloper>
等替换H
和template<typename H>
void writeToFile(ofstream& fileToBeWrittenTo, H firstArray, H secondArray, H thirdArray, H fourthArray)
{
for (int i = 0; i < firstArray.size(); i++)
{
fileToBeWrittenTo << firstArray[i].identificationCode << "|" << firstArray[i].firstName << "|" << firstArray[i].lastName << "|" << firstArray[i].typeOfEmployee << "|";
for (int j = 0; j < firstArray[i].knownLanguages.size(); j++)
fileToBeWrittenTo << firstArray[i].knownLanguages[j] << ':';
fileToBeWrittenTo << endl;
}
for (int i = 0; i < secondArray.size(); i++)
{
fileToBeWrittenTo << secondArray[i].identificationCode << "|" << secondArray[i].firstName << "|" << secondArray[i].lastName << "|" << secondArray[i].typeOfEmployee;
fileToBeWrittenTo << endl;
}
for (int i = 0; i < thirdArray.size(); i++)
{
fileToBeWrittenTo << thirdArray[i].identificationCode << "|" << thirdArray[i].firstName << "|" << thirdArray[i].lastName << "|" << thirdArray[i].typeOfEmployee << "|" << thirdArray[i].isAutomated;
fileToBeWrittenTo << endl;
}
for (int i = 0; i < fourthArray.size(); i++)
{
fileToBeWrittenTo << fourthArray[i].identificationCode << "|" << fourthArray[i].firstName << "|" << fourthArray[i].lastName << "|" << fourthArray[i].typeOfEmployee;
fileToBeWrittenTo << endl;
}
};
这样的数据类型?< / p>
{{1}}
答案 0 :(得分:0)
一种可能的解决方案是,我们可以使用template<typename H>
等来代替使用#define H vector<SoftwareDeveloper>
,并在函数声明中使用它
void writeToFile(ofstream& fileToBeWrittenTo, H firstArray, K secondArray, J thirdArray, L fourthArray)
答案 1 :(得分:0)
根据有用的评论:此答案假定您的所有类型都具有相同的数据成员,但是某些类型可能还有其他不应导出的属性。这不是一个现实的用例,而是唯一一个我可以看到模板解决方案在这里真正有意义的用例。当然,如果所有类型都相同,则不应该有多个类。
这里通常的做法是让你的SoftwareDeveloper
,Manager
,...类继承自同一个基类,然后将它们存储在数组vector<unique_ptr<Person>>
中。
如果这在这里没有意义,你确实可以使用模板:
template<typename H>
void writeToFile(ostream& fileToBeWrittenTo, const H& arr)
{
for (int i = 0; i < arr.size(); i++)
{
fileToBeWrittenTo << arr[i].identificationCode << "|" << arr[i].firstName << "|" << arr[i].lastName << "|" << arr[i].typeOfEmployee << "|";
for (int j = 0; j < arr[i].knownLanguages.size(); j++)
fileToBeWrittenTo << arr[i].knownLanguages[j] << ':';
fileToBeWrittenTo << std::endl;
}
}
现在,您可以使用所有单个矢量实例调用此模板:
writeToFile(stream, softwareDeveloperVector);
writeToFile(stream, managerVector);
// and so on
这样,您可以使用较小的功能多次调用,而不是将所有内容多次放入一个函数中。当然,这些多个调用可以放入另一个函数中。无论如何,这将节省您的代码(如果您想稍后更改某些内容,可能会有神经和时间)。
此处需要注意的其他事项:
你应该使用ostream代替ofstream,因为这样更多 一般;你也可以使用文件流,但也可以使用其他输出 像cout这样的流
你应该在这里传递H作为参考,以便它通过引用传递,而不是由于整个数组被复制而大大减慢的值传递,这可能根本不可能或根据你的Employee类型而有意义
这个函数会热变换你的向量,所以你应该通过
vector as const =&gt;再加上我之前的观点,你应该使用
const H&
答案 2 :(得分:0)
vector<SoftwareDeveloper>
,vector<Manager>
,vector<Tester>
,vector<TeamLeader>
是不同的类型,因此您需要区分它们。你可以这样做,
template<typename H, K, J, L>
void writeToFile(ofstream& fileToBeWrittenTo, H firstArray, K secondArray, J thirdArray, L fourthArray)
{
...
}