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
相关产品推荐
相关产品推荐

