使用 make_shared 防止复制构造
Prevent copy-construction with make_shared
我有一个管理器 class 允许客户通过两种方法添加组件:一种不带参数的默认构造组件,另一种采用右值(应该允许客户使用自定义组件的构造函数)。
这是我想出的代码:
template <class TComponent>
std::shared_ptr<TComponent> AddComponent()
{
return AddComponent(TComponent{ this });
}
template <class TComponent>
std::shared_ptr<TComponent> AddComponent(const TComponent &&obj)
{
auto ptr = std::make_shared<TComponent>(obj);
vec.push_back(ptr);
return ptr;
}
我遇到的问题是 std::make_shared 总是复制构造对象。有没有办法防止这种行为?
我读到了完美转发,但它似乎对这里没有帮助。
I read about perfect forwarding but it doesn't seem to help here.
我不明白为什么它不会。
只需删除 const 即可使 move 构造成为可能,并添加 std::forward
:
template <class TComponent>
std::shared_ptr<TComponent> AddComponent(TComponent &&obj)
{
auto ptr = std::make_shared<TComponent>(std::forward<TComponent>(obj));
vec.push_back(ptr);
return ptr;
}
现在,将移动右值。左值将被复制,这是您无法避免的。
我有一个管理器 class 允许客户通过两种方法添加组件:一种不带参数的默认构造组件,另一种采用右值(应该允许客户使用自定义组件的构造函数)。
这是我想出的代码:
template <class TComponent>
std::shared_ptr<TComponent> AddComponent()
{
return AddComponent(TComponent{ this });
}
template <class TComponent>
std::shared_ptr<TComponent> AddComponent(const TComponent &&obj)
{
auto ptr = std::make_shared<TComponent>(obj);
vec.push_back(ptr);
return ptr;
}
我遇到的问题是 std::make_shared 总是复制构造对象。有没有办法防止这种行为? 我读到了完美转发,但它似乎对这里没有帮助。
I read about perfect forwarding but it doesn't seem to help here.
我不明白为什么它不会。
只需删除 const 即可使 move 构造成为可能,并添加 std::forward
:
template <class TComponent>
std::shared_ptr<TComponent> AddComponent(TComponent &&obj)
{
auto ptr = std::make_shared<TComponent>(std::forward<TComponent>(obj));
vec.push_back(ptr);
return ptr;
}
现在,将移动右值。左值将被复制,这是您无法避免的。