c++ - 通过克隆另一个容器的元素来创建智能指针容器
问题描述
我有一个类,它支持克隆(通过方法clone
)。我在一个向量中有一堆它的实例std::unique_ptr
。
现在,我想std::set
从上面的向量中创建一个相同的智能指针,最好是在它的构造过程中。明显的设计如下:
#include <memory>
#include <set>
#include <vector>
class A
{
public:
/// type of itself
typedef A self;
A() = default;
A(const self& another) = default;
virtual ~A() = default;
std::unique_ptr<A> clone() const
{
return std::make_unique<A>();
}
};
class SetOfA
{
public:
SetOfA() = default;
// Here is the method I would like to improve
SetOfA(const std::vector<std::unique_ptr<A> >& data)
{
//do not like this loop, prefer this to be in initialization part?
for (const auto& d : data) {
set_of_a.insert(std::move(d->clone()));
}
}
private:
std::set<std::unique_ptr <A> > set_of_a;
};
但是有没有办法避免for
构造函数中的这个循环并将std::set
构造移动到初始化部分?
解决方案
如果您可以使用 Boost,这是一个可能的解决方案:
SetOfA(const std::vector<std::unique_ptr<A>>& data) :
set_of_a(
boost::make_transform_iterator(data.begin(), std::mem_fn(&A::clone)),
boost::make_transform_iterator(data.end(), std::mem_fn(&A::clone)))
{ }
推荐阅读
- angular - Ionic 4:单击时如何聚焦离子段的视图
- winapi - 为什么 16 及以上扇区的访问被拒绝?
- oracle - Oracle 中的 FireDac 调用函数
- google-cloud-sdk - Google-cloud-sdk 安装失败,语法无效
- asp.net-core - 是否可以在 swagger 中添加对全局参数的引用
- java - 调试do-while循环出现多条语句
- firebase - Unity Firebase Google 登录
- javascript - 使用 for 循环将 html 元素的值存储到数组中并显示在另一个元素中
- javascript - 仅使用 JavaScript(无 JQuery)检测特定“图例”元素何时在网页上可见
- lua - 当玩家加入服务器时,每个人都会弹出 Garry's Mod MOTD