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

如何修改C++标准库内置函数访问权限?以unique_ptr的get()为例

解决方案:封装自定义只读智能指针

无法直接修改C++标准库内置函数的访问权限,要实现你的需求,最可靠的方式是封装一个只读智能指针包装类,只暴露安全的操作接口,完全隐藏裸指针获取方法,同时阻止所有权转移。

自定义只读智能指针实现

template <typename T>
class ReadOnlyUniquePtr {
private:
    const std::unique_ptr<T>& m_inner_ptr;

    // 禁止拷贝、移动,避免所有权意外转移
    ReadOnlyUniquePtr(const ReadOnlyUniquePtr&) = delete;
    ReadOnlyUniquePtr& operator=(const ReadOnlyUniquePtr&) = delete;
    ReadOnlyUniquePtr(ReadOnlyUniquePtr&&) = delete;
    ReadOnlyUniquePtr& operator=(ReadOnlyUniquePtr&&) = delete;

public:
    // 构造函数:接收const unique_ptr引用
    explicit ReadOnlyUniquePtr(const std::unique_ptr<T>& ptr) : m_inner_ptr(ptr) {}

    // 仅提供安全的对象访问方式,不暴露裸指针
    const T& operator*() const noexcept {
        return *m_inner_ptr;
    }

    const T* operator->() const noexcept {
        return m_inner_ptr.operator->();
    }

    // 辅助查询方法:判断指针是否为空
    bool is_null() const noexcept {
        return m_inner_ptr == nullptr;
    }
};

用法示例

// 测试用类
class A {
public:
    void do_something() const {}
};

void SmartPointerUsage(ReadOnlyUniquePtr<A> ref)
{
    // 合法操作:访问对象成员或引用
    ref->do_something();
    const A& obj = *ref;

    // 以下操作均触发编译错误,符合预期
    // A* rawPtr = ref.get(); // 错误:类中未定义get()方法
    // std::unique_ptr<A> moved = std::move(ref); // 错误:移动构造函数已被删除
    // delete ref; // 错误:无法删除类类型对象
}

int main() {
    std::unique_ptr<A> ptr = std::make_unique<A>();
    SmartPointerUsage(ReadOnlyUniquePtr<A>(ptr));
    return 0;
}

需求验证

  1. 禁止调用.get():包装类未暴露get()方法,任何尝试调用都会直接触发编译错误。
  2. 阻止std::move():类的移动构造/赋值函数已被显式删除,std::move(ref)会触发编译错误。
  3. delete操作触发编译错误:尝试删除ReadOnlyUniquePtr对象时,编译器会直接报错;由于包装类未提供裸指针获取接口,用户无法拿到可用于delete的原始指针(operator->返回的const T*若被强制delete属于恶意操作,但已从接口层面最大程度避免)。

内容的提问来源于stack exchange,提问作者Windings-Lab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:55:27