gpt4 book ai didi

c++ - 将 shared_ptr 的集合转换为 weak_ptr 的集合

转载 作者:太空狗 更新时间:2023-10-29 20:12:28 30 4
gpt4 key购买 nike

我很想找到一种方法来自动将可转换类型的容器相互转换。

例如,我希望它存在:

template<typename Collection, typename T>
Collection<std::weak_ptr<T> > convert(const Collection<std::shared_ptr<T> > &c){
Collection<std::weak_ptr<T> > l;
for (auto &e : c) l.push_back(e);
return l;
}

我实际上想从参数类型中移除一层实例化模板,并使用不同的模板类型重新实例化它。

更理想的是,我可以编写一个更通用的转换函数;即不假设 push_back 的存在并且不专门用于 shared_ptr 转换为 weak_ptr 的情况。

有人知道这是否可行吗?

最佳答案

此函数存在并称为 std::copy

 Collection1 a;
Collection2 b;

std::copy(std::begin(a), std::end(a), std::back_inserter(b));

这适用于任何集合,只要为目标容器定义了 std::back_inserter 并且相应的元素是可转换的。

如果你需要在没有 back_inserter 的情况下支持某些东西,你需要为 std::copy 提供你自己的迭代器,并确保它适用于你的容器。

如果你想保持集合的“类型”并且只是交换模板参数,你可以使用这个:

template <template<typename> class OutPtr,
template<typename> class InPtr,
template<typename, typename> class Coll,
typename Elem, typename Alloc>
auto transform_ptr_collection(const Coll<InPtr<Elem>, Alloc>& in) ->
Coll<OutPtr<Elem>, Alloc>
{
return Coll<OutPtr<Elem>, Alloc>(std::begin(in), std::end(in));
}

// call it

suto out = transform_ptr_collection<std::weak_ptr>(vector_of_shared_ptr);

但我不会推荐它。首选迭代器接口(interface)而不是集合接口(interface),它们更通用且更易于使用。

关于c++ - 将 shared_ptr 的集合转换为 weak_ptr 的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27467028/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com