Chromium Code Reviews| Index: base/memory/scoped_ptr.h |
| diff --git a/base/memory/scoped_ptr.h b/base/memory/scoped_ptr.h |
| index 7133a3407d0a185158e1923ab961bc50f5e462e4..77a203992038f07687baad78a0b37ea55b21ba97 100644 |
| --- a/base/memory/scoped_ptr.h |
| +++ b/base/memory/scoped_ptr.h |
| @@ -67,6 +67,22 @@ |
| // the Pass() function to signify a destructive transfer of state. CreateFoo() |
| // is different though because we are constructing a temporary on the return |
| // line and thus can avoid needing to call Pass(). |
| +// |
| +// Pass() properly handles upcast in assignment, i.e. you can assign |
| +// scoped_ptr<Child> to scoped_ptr<Parent>: |
| +// |
| +// scoped_ptr<Foo> foo(new Foo()); |
| +// scoped_ptr<FooParent> parent = foo.Pass(); |
| +// |
| +// PassAs<>() should be used to upcast return value in return statement: |
| +// |
| +// scoped_ptr<Foo> CreateFoo() { |
| +// scoped_ptr<FooChild> result(new FooChild()); |
| +// return result.PassAs<Foo>(); |
| +// } |
| +// |
| +// Note that PassAs<>() is implemented only for scoped_ptr, but not for |
| +// scoped_array. This is because casting array pointers may not be safe. |
| #ifndef BASE_MEMORY_SCOPED_PTR_H_ |
| #define BASE_MEMORY_SCOPED_PTR_H_ |
| @@ -182,6 +198,11 @@ class scoped_ptr { |
| return retVal; |
| } |
| + template <typename PassAsType> |
| + scoped_ptr<PassAsType> PassAs() { |
|
darin (slow to review)
2012/01/24 21:17:53
Had you considered putting this in base/move.h alo
Sergey Ulanov
2012/01/24 21:55:18
Yes, I considered it, but decided against it becau
|
| + return scoped_ptr<PassAsType>(release()); |
| + } |
| + |
| private: |
| C* ptr_; |