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

如何获取带类型的nullptr字面量?

问题:std::is_pointer_v对nullptr返回false的替代处理方案

笔者发现std::is_pointer_v<std::nullptr_t>的结果为false,这正是下述代码输出不符合预期的原因:

template <typename T> std::string_view type_str() { /* 返回类型名称 */ }
template <typename T> const auto type_name = type_str<T>();

template <typename T> void fptr(const T *const t) {
    if (t)
        std::print("{} = {:X}.\n", static_cast<const void *const>(t), *t);
    else
        std::print("nullptr.\n");
}
// #1 指针类型重载
template <typename T> requires std::is_pointer_v<T> void f(T t) {
    std::print("[{}] is pointer --> ", type_name<T>);
    fptr(t);
}
// #2 通用重载
template <typename T> void f(T t) {
    std::print("[{}] is NOT pointer.\n", type_name<T>);
}

int main()
{
    const auto v0 = 0xfabada;
    auto v1 = 0xc0ffee;

    f(&v0);
    f(&v1);
    f(nullptr);

    return 0;
}

该代码的输出为:

[const int*] is pointer --> 0xWHATEVER = FABADA.
[int*] is pointer --> 0xWHATEVER = C0FFEE.
[std::nullptr_t] is NOT pointer.

笔者原本预期std::is_pointer_v<std::nullptr_t>返回true,从而调用函数模板#1。目前找到的一种解决方案是创建“带类型的nullptr”模板变量:

template <typename T>
constexpr T *NULLPTR = nullptr;

// ...

int main() {
    const auto v0 = 0xfabada;
    auto v1 = 0xc0ffee;

    f(&v0);
    f(&v1);
    f(nullptr);
    f(NULLPTR<int>);

    return 0;
}

对应的输出为:

[const int*] is pointer --> 0xWHATEVER = FABADA.
[int*] is pointer --> 0xWHATEVER = C0FFEE.
[std::nullptr_t] is NOT pointer.
[int*] is pointer --> nullptr.

但笔者希望找到其他方法:无需创建存在误用风险的模板变量指针实例,同时能让std::is_pointer_v返回true,且保留指针类型信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 23:31:02