std::optional
とstd::shared_ptr
を両方使っていると、空状態を設定するためにあっちはstd::nullopt
、こっちはnullptr
のように指定するので、使い分けがわずらわしいときがあります。
なにも考えず{}
を指定してもよいのですが、「値初期化というのではなく空状態を指定することを示したい!」という欲求があるので、std::optional
とstd::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; }
・・・どうだろう?