如何为ScopedPtr模板类实现通用构造函数以支持T的值初始化?
实现ScopedPtr的通用构造函数
完全可以通过可变参数模板和完美转发实现这个需求,让ScopedPtr的构造函数接受任意参数并转发给T的构造函数,从而支持不同类型的初始化。
完整代码实现
首先修改ScopedPtr类,添加通用构造函数并补全必要的成员:
#include <utility> // 用于std::forward template <typename T> class ScopedPtr { T* ptr_; public: // 默认构造函数:调用T的默认构造 ScopedPtr() : ptr_(new T{}) {} // 通用构造函数:接受任意参数,完美转发给T的构造 template <typename... Args> ScopedPtr(Args&&... args) : ptr_(new T{std::forward<Args>(args)...}) {} // 析构函数:释放内存,避免泄漏 ~ScopedPtr() { delete ptr_; } // 禁用拷贝/移动操作,保证指针独占性 ScopedPtr(const ScopedPtr&) = delete; ScopedPtr& operator=(const ScopedPtr&) = delete; ScopedPtr(ScopedPtr&&) = delete; ScopedPtr& operator=(ScopedPtr&&) = delete; };
测试代码(与需求一致)
#include <string> struct Numeric_t { int integer_; double real_; Numeric_t(int integer = 0, double real = 0) : integer_(integer), real_(real) {} }; struct String_t { std::string str_; String_t(std::string str) : str_(str) {} }; int main() { ScopedPtr<Numeric_t> num{1, 2.0}; // 匹配Numeric_t(int, double)构造 ScopedPtr<String_t> str{"Hello, world"}; // 字符串字面量隐式转换为std::string,匹配String_t(std::string)构造 }
关键说明
- 可变参数模板:
template <typename... Args>允许构造函数接受任意数量、任意类型的参数,适配不同T的构造函数签名。 - 完美转发:
std::forward<Args>(args)...会保留参数的左值/右值属性,确保T的构造函数能接收到正确的参数类型,避免不必要的拷贝。 - 内存管理:必须实现析构函数释放
ptr_,否则会造成内存泄漏。 - 独占性保证:禁用拷贝和移动操作,确保ScopedPtr始终独占指向的对象,符合智能指针的设计意图。
内容的提问来源于stack exchange,提问作者Vasilii
相关产品推荐
相关产品推荐

