typesafe な NULL

#include <iostream>

class NullObject {
public:
    static const NullObject instance;

public:
    template<typename T>
    inline operator T*() const { return 0; }

private:
    NullObject() {}
    NullObject(const NullObject& other);
    NullObject& operator=(const NullObject& other);
};

const NullObject NullObject::instance;
const NullObject& null = NullObject::instance;

void func(int)
{
    std::cout << "void func(int)" << std::endl;
}

void func(char*)
{
    std::cout << "void func(char*)" << std::endl;
}

int main(int, char**)
{
    func(null);
    return 0;
}

これでオーバーロードでポインタか int でトラブルになることは無いんじゃないかな。メンバテンプレートを使っているからあんまり古いコンパイラだとコンパイルできないと思うけど。
Effective C++More Effective C++ でこんな感じのコードがあって色々書いてあった気がするけど、日本においてきて今手元にないから参照できない。