Копирование элементов vector<DataA>
и vector<DataB>
в vector<IData>
не будет работать, поскольку оно страдает от нарезки объектов .Вместо этого вам нужно использовать vector<IData*>
, чтобы позволить полиморфизму работать правильно, например:
int calculateDataSum(const vector<IData*> &datas)
{
int sum = 0;
for (auto d : datas)
{
sum += d->getNumber();
}
return sum;
}
int main()
{
DataA dA0(10);
DataA dA1(20);
DataB dB0(100);
DataB dB1(200);
vector<DataA> datasA;
datasA.push_back(dA0);
datasA.push_back(dA1);
vector<DataB> datasB;
datasB.push_back(dB0);
datasB.push_back(dB1);
vector<IData*> datas;
transform(begin(datasA), end(datasA), back_inserter(datas),
[](DataA &a) -> IData* { return &a; }
);
int resultA = calculateDataSum(datas);
datas.clear();
transform(begin(datasB), end(datasB), back_inserter(datas),
[](DataB &b) -> IData* { return &b; }
);
int resultB = calculateDataSum(datas);
cout << resultA << endl;
cout << resultB << endl;
return 0;
}
Или, проще:
int main()
{
DataA dA0(10);
DataA dA1(20);
DataB dB0(100);
DataB dB1(200);
vector<IData*> datasA;
datasA.push_back(&dA0);
datasA.push_back(&dA1);
vector<IData*> datasB;
datasB.push_back(&dB0);
datasB.push_back(&dB1);
int resultA = calculateDataSum(datasA);
int resultB = calculateDataSum(datasB);
cout << resultA << endl;
cout << resultB << endl;
return 0;
}
Или вы можете просто избавиться от *Всего 1015 * с:
int calculateDataSum(initializer_list<IData*> datas)
{
int sum = 0;
for (auto d : datas)
{
sum += d->getNumber();
}
return sum;
}
int main()
{
DataA dA0(10);
DataA dA1(20);
DataB dB0(100);
DataB dB1(200);
int resultA = calculateDataSum({&dA0, &dA1});
int resultB = calculateDataSum({&dB0, &dB1});
cout << resultA << endl;
cout << resultB << endl;
return 0;
}
Или даже:
int calculateDataSum(const IData &arg)
{
return arg.getNumber();
}
template <typename... Arguments>
int calculateDataSum(const IData &arg1, const Arguments&... args)
{
return arg1.getNumber() + calculateDataSum(args...);
}
/* alternatively, in C++17 and later...
template <typename... Arguments>
int calculateDataSum(const IData &arg1, const Arguments&... args)
{
int sum = arg1.getNumber();
if constexpr(sizeof...(args) > 0)
{
sum += calculateDataSum(args...);
}
return sum;
}
*/
int main()
{
DataA dA0(10);
DataA dA1(20);
DataB dB0(100);
DataB dB1(200);
int resultA = calculateDataSum(dA0, dA1);
int resultB = calculateDataSum(dB0, dB1);
cout << resultA << endl;
cout << resultB << endl;
return 0;
}