template struct Box { T value; const T& get_value() const { return value; } const T* get_ptr() const { return &value; } }; using FloatBox = Box; using IntBox = Box; template struct MoveOnly { T value; }; template <> struct MoveOnly { double value; }; struct MoveOnlyBox { MoveOnly value1; MoveOnly value2; };