我有一个管理器类,它允许客户端通过两种方法添加组件:一种没有参数默认构造组件,另一种采用右值(这应该允许客户端使用组件的自定义构造函数)。
这是我想出的代码:
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总是复制构造对象。有没有办法防止这种行为?我读过关于完美转发的文章,但在这里似乎没有帮助。
我读过关于完美转发的文章,但在这里似乎没有帮助。
我不明白为什么它不会。
只需删除 const 以使移动构造成为可能,然后添加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;
}
现在,右值将被移动。左值将被复制,这是您无法避免的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句