#define NULL 0 に代わる新たな NULL を考えてみた。

仕様:
整数型に変換できないこと。
あらゆる型のポインタに代入できること。
あらゆる型のポインタと等価比較できること。

class NullPointer{
private:
NullPointer(const NullPointer&);
const NullPointer& operator=(const NullPointer&);
void* operator&();
public:
NullPointer(){}
template<typename T> operator T*()const{ return 0; }
};
NullPointer nullPointer;
template<typename T> inline bool operator==(T* p, const NullPointer&){ return p==0; };
template<typename T> inline bool operator!=(T* p, const NullPointer&){ return p!=0; };
template<typename T> inline bool operator==(const NullPointer&, T* p){ return 0==p; };
template<typename T> inline bool operator!=(const NullPointer&, T* p){ return 0!=p; };
#include <cstddef>
#undef NULL
#define NULL nullPointer