modern c++系列 1. 空指针nullptr实现

modern c++ 系列关于空指针推荐用 nullptr 而不是 NULL(0, 或者0L)

为什么要用nullptr

考虑下面基于两个场景

  1. 函数重载
void f(int);
void f(long);
void f(void*);

当你想调用第三个函数 f(NULL) 时
很可惜最终调用的是第一个函数, 甚至可能是第二个函数(视NULL的定义而论)

  1. 模版函数场景
	template<typename Func, typename Ptr>
void my_invoke(Func func, Ptr ptr) {
    func(ptr);
}

void fi(int){
    cout << "fi(int)" << endl;
}
void fl(long){
    cout << "fl(long)" << endl;
}
void fv(void*){
    cout << "fv(void*)" << endl;
}

int main() {
    my_invoke(fv, NULL); // 不行, 因为推到出的Ptr是int
	 my_invoke(fv, nullptr)  //ok

nullptr 大致实现

#include <numeric>
using namespace std;

template<typename R, typename ...Args>
struct Fu {
    using type =  R(*)(Args...);
};

struct  my_nullptr_t {
    constexpr my_nullptr_t() {}
    constexpr my_nullptr_t(int __nat::*) {}

    constexpr operator int () const {return 0;}

	// 转裸指针
    template <class _Tp>
    constexpr
    operator _Tp* () const {return 0;}

	// 转函数指针
    template <class Tp, class ...Args>
    constexpr
    operator typename Fu<Tp, Args...>::type()  const {return 0;}
	// 转成员对象指针
    template <class _Tp, class _Up>
    constexpr
    operator _Tp _Up::* () const {return 0;}

    friend constexpr  bool operator==(my_nullptr_t, my_nullptr_t) {return true;}
    friend constexpr  bool operator!=(my_nullptr_t, my_nullptr_t) {return false;}
};

inline constexpr my_nullptr_t get_nullptr_t() {return my_nullptr_t(0);}

#define my_nullptr get_nullptr_t()

class A{
public:
    static int z;
};

int add(int a) {
    return a + 1;
}

int main() {
   int A::* x = my_nullptr;
   int(*fz)(int, int) = my_nullptr;
   int* zz = my_nullptr;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值