Если вы хотите преобразовать из любого исходного контейнера (ContSource) в другое место назначения контейнера с некоторым Smart-указателем в середине, следующий фрагмент кода должен выполнить задание.
Он использует параметр шаблона шаблона для обоих ContDest и ContSource. Аргумент шаблона variadi c для обоих из них не требуется, если вы используете только контейнер Qt, поскольку они задаются только одним аргументом, но если вы используете контейнеры std, они определяются типом и распределителем. Таким образом, код с аргументом шаблона variadi c отлично работает с обоими, как показано в примере.
template < template <typename... Args> class ContDest,
template <typename... Args> class ContSource,
template<typename... Args> class SmartPointer,
typename E>
ContDest<SmartPointer<E>> fillGadget(const ContSource<E>& values)
{
ContDest<SmartPointer<E>> res;
for (const auto & val : values)
res.push_back(SmartPointer<E>(new E(val)));
return res;
}
const QList<int> vals = { 1,2,3 };
auto gadget_stdvector = fillGadget< std::vector, QList, std::shared_ptr, int >(vals);
std::deque<int> val2 = { 1 ,2, 3 };
auto gadget_qvector = fillGadget< QVector, std::deque, QSharedPointer, int >(val2);
Обратите внимание, что он неоптимален для всех случаев, когда значения исходного контейнера и контейнера назначения сохраняются непрерывно ,