C++ unique_ptr إشارة ثابتة
-
23-12-2019 - |
سؤال
أنا أحاول أن ترحيل الحل باستخدام المؤشرات واحد باستخدام unique_ptr ، لتبسيط التعامل مع الموارد.وأنا على علم من نقل دلالات و استخدام std::move()
العمل مع unique_ptr هو.
حاليا لدي وظيفة مع التوقيع int foo(const T2DMatrix* m)
وأنا أسمي هذا باستخدام تخصيصها 2D-مصفوفة الكائن.وظيفة foo
يتطلب فقط للقراءة فقط الوصول إلى T2DMatrix الطبقة ، ومن ثم const الحجة.الآن, لقد هاجر هذا int foo(unique_ptr<const T2DMatrix>& m)
.من وظيفة مختلفة ، process()
, الذي لديه unique_ptr<T2DMatrix>
وجوه (التي تم إنشاؤها باستخدام مصنع وظيفة) ، أريد أن تمرير الكائن فو كمعلمة.ومع ذلك ، فإن المترجم لا تسمح لي بذلك.يرجى ملاحظة, أنا لا أريد أن نقل ملكية الكائن من process()
إلى foo()
, وبالتالي استخدام المراجع.داعيا فو() مع unique_ptr<const T2DMatrix>
يعمل بشكل جيد, ومع ذلك const ضمان أن لا يتم فرض إذا قمت بتغيير وظيفة التوقيع.
ملاحظة:حل واحد لقد وجدت لخلق جديد unique_ptr<const T2DMatrix>
الكائن في عملية () ، ونقل ملكية من الأصلي unique_ptr<T2DMatrix>
كائن باستخدام std::move()
, وتمريرها إلى فو () ، ومرة أخرى نقل الملكية في العملية().ولكن هذا لا يبدو الحل الأمثل.
يرجى اقتراح ما يعادل مؤشر الحل الذي كان يسمح لي بالمرور T2DMatrix* حجة const T2DMatrix* المعلمة.حاولت استخدام msvc2012, msvc2013 و g++4.8, مع كل نفس النتائج.
المحلول
إذا كانت وظيفة لا تتطلب ملكية تمر عادي المرجعية بدلا من الإشارة إلى unique_ptr
:
int foo(T2DMatrix const& m);
std::unique_ptr<T2DMatrix> matrixptr;
[...]
foo(*matrixptr);
ليس هناك حاجة إلى تقييد مصطنع foo
إلى unique_ptr
s إذا كانت وظيفة لا يهتمون الملكية على أي حال.