如何获取带类型的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
相关产品推荐
相关产品推荐

