编辑:我指的是 std::make_shared 和 std::make_shared,而不是它们的实际构造函数。我已经编辑了标题,但下面的文字仍然谈论构造函数。忽略我使用“构造函数”这个词
我正在尝试了解智能指针在幕后是如何工作的,但源文件似乎超出了我的理解,所以我想也许这里有人可以帮助我。智能指针的构造函数的声明和实现是如何工作的?
通常,您会像这样创建构造函数:
Object(SomeType member) : member_(member) {}
智能指针显然使用类模板让编码器选择指针将指向的类型,但构造函数也需要构造指针将指向的类型的对象所需的参数。这是如何实现的?当我们不知道需要多少或什么类型的参数时,您如何创建这样的构造函数,因为我们不知道我们将构造的对象的类型?
Object(/*???*/) : member_(new SomeType(/*???*/)) {}
答案 0 :(得分:3)
您可以使用 variadic templates 和 forwarding 将任意数量的参数转发给另一个构造函数或函数。例如:
#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;
};
答案 1 :(得分:1)
这是 C++ 的一个非常强大的特性。它被称为Variadic templates。
这是一个简单的例子,使用
void print()
{
}
template <typename T, typename... Types>
void print(T var1, Types... var2)
{
cout << var1 << endl ;
print(var2...) ;
}
现在您可以使用任意数量的任意类型的变量调用 print。但在一种情况下,传递的类型实现了运算符 <<
。
然后,你可以这样调用print:
print(1, 2, 3.14, "Pass me any number of arguments", "I will print\n");
C++ 标准库非常通用。如果您缺乏对泛型编程的理解,那么理解库源代码可能具有挑战性。一个好的练习可以是:实现一个排序函数,该函数在一次调用中对包含不同类型的多个向量进行排序。