You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:54:14