سؤال

أنا أحاول أن ترحيل الحل باستخدام المؤشرات واحد باستخدام 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_ptrs إذا كانت وظيفة لا يهتمون الملكية على أي حال.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top