功能使用多种类型的结构

时间:2016-02-21 10:33:30

标签: c++ templates

我是一个函数原型:

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>等替换Htemplate<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}}

3 个答案:

答案 0 :(得分:0)

一种可能的解决方案是,我们可以使用template<typename H>等来代替使用#define H vector<SoftwareDeveloper>,并在函数声明中使用它 void writeToFile(ofstream& fileToBeWrittenTo, H firstArray, K secondArray, J thirdArray, L fourthArray)

答案 1 :(得分:0)

根据有用的评论:此答案假定您的所有类型都具有相同的数据成员,但是某些类型可能还有其他不应导出的属性。这不是一个现实的用例,而是唯一一个我可以看到模板解决方案在这里真正有意义的用例。当然,如果所有类型都相同,则不应该有多个类。

这里通常的做法是让你的SoftwareDeveloperManager,...类继承自同一个基类,然后将它们存储在数组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&

  • 这并不重要,但通常会为您的模板命名 参数T

答案 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)
{
...
}