c++ - std::make_shared 和 std::make_unique 如何在幕后工作?
问题描述
编辑:我指的是 std::make_shared 和 std::make_shared,而不是它们的实际构造函数。我已经编辑了标题,但下面的文字仍然在谈论构造函数。忽略我使用“构造函数”这个词
我正在尝试了解智能指针如何在幕后工作,但源文件似乎超出了我的理解范围,所以我想也许这里有人可以帮助我。智能指针的构造函数的声明和实现是如何工作的?
通常,您创建这样的构造函数:
Object(SomeType member) : member_(member) {}
智能指针显然使用类模板让编码人员选择指针将指向的类型,但构造函数也接受构造指针将指向的类型的对象所需的参数。这是如何实现的?当我们不知道需要多少或什么类型的参数时,您如何创建这样的构造函数,因为我们不知道我们将要构造的对象的类型?
Object(/*???*/) : member_(new SomeType(/*???*/)) {}
解决方案
您可以使用可变参数模板和转发将任意数量的参数转发给另一个构造函数或函数。例如:
#include <memory> // Include std::forward.
template <typename T>
class SmartPointer
{
public:
template <typename ... Args>
SmartPointer(Args&& ... args) : the_pointer{new T{std::forward<Args>(args)...}} {}
// Other methods ...
private:
T* the_pointer;
};
struct Test
{
int a;
float b;
};
int main()
{
SmartPointer<Test> pointer { 0, 1.0f };
}
这会将参数0
转发1.0f
给Test
. 扩展的类看起来像这样:
class SmartPointer
{
public:
SmartPointer(int&& a, float&& b)
: the_pointer{new Test{std::forward<int&&>(a), std::forward<float&&>(b)}} {}
// Other methods ...
private:
Test* the_pointer;
};
推荐阅读
- android - 更新列表视图时如何保持滚动
- raku - 如何在 Raku 语法中使用 :global 进行匹配?
- python - 我正在抓取 rightmove 刮板网站,但在我的代码中引发此错误
- javascript - 推送到数组时,值被重复
- python - VS Code 在 Docker 容器中远程调试 Python
- spring - Spring批处理JpaPagingItemReader页面大小和maxitemcount
- node.js - windows的电子自动更新
- mysql - 在 MySQL 数据库中,您如何为属性提供条件
- c++ - 逐位复制图像 C++
- sql-server - Varchar charset=utf8 vs nvarchar