optionalとshared_ptrで共通のnull

std::optionalstd::shared_ptrを両方使っていると、空状態を設定するためにあっちはstd::nullopt、こっちはnullptrのように指定するので、使い分けがわずらわしいときがあります。

なにも考えず{}を指定してもよいのですが、「値初期化というのではなく空状態を指定することを示したい!」という欲求があるので、std::optionalstd::shared_ptr両方の空状態に変換できるオブジェクトがあると便利かなと思ったりします。

#include <optional>
#include <memory>

struct unified_null {
    template <class T>
    operator std::shared_ptr<T>() const { return {}; }

    template <class T>
    operator std::optional<T>() const { return {}; }
};

inline constexpr unified_null unull{};

int main()
{
    std::optional<int> o = unull;
    std::shared_ptr<int> p = unull;
}

・・・どうだろう?