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

D语言标准库Phobos是否有类似C++的NotNull<T>或not_null智能指针?

D语言Phobos与非空指针包装器的那些事儿

嘿,我来给你理清楚这个问题:Phobos作为D语言的标准库,并没有直接提供和C++ NotNull<T>或者核心指南里not_null完全对应的原生类型,不过相关的替代方案和第三方实现倒是不少,下面给你详细说说:

一、Phobos里的间接实现方式

虽然没有现成的非空包装器,但你可以用Phobos自带的工具间接实现类似效果:

  • 对于原始指针,你可以借助std.exception里的enforce函数做运行时校验,比如enforce(myPtr !is null, "指针不能为null");,虽然不是编译期检查,但能快速给指针加上非空保障。
  • std.typecons.Nullable是用来处理可空类型的,但反过来想,你可以基于它封装一个只接受非空值的类型,不过需要自己写构造逻辑来拦截空值。

二、成熟的第三方实现

社区里有几个专门做这件事的库,用起来和C++的not_null体验很接近:

  • dnotnull:这个库就是专门对标C++的not_null做的,支持原始指针、D语言的智能指针(比如Unique、Shared),既有编译期的空值检查,也有运行时的兜底校验,用法简单直接。
  • mir-core:这是D社区里很流行的工具库,里面的NonNull!T类型不仅支持指针,还能处理引用类型,提供了安全的访问接口,如果你已经在使用mir生态的其他库,这个会很顺手。

三、自己动手封装的简单版本

要是不想引入第三方库,你也可以自己写个轻量版的NotNull模板,满足基础需求:

struct NotNull(T) if (isPointer!T || is(T == class)) {
    private T _innerPtr;
    // 构造时直接校验非空
    this(T ptr) {
        import std.exception : enforce;
        enforce(ptr !is null, "NotNull类型不能用null初始化");
        _innerPtr = ptr;
    }
    // 重载解引用操作符
    auto opUnary(string op : "*")() {
        return *_innerPtr;
    }
    // 提供获取内部指针的方法
    T get() @property {
        return _innerPtr;
    }
    // 可以按需重载->操作符、索引等
}

这个小结构在构造阶段就保证了非空,日常简单场景完全够用。


内容的提问来源于stack exchange,提问作者Denis Gladkiy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:33:39