我需要将cv::Ptr
作为参数传递给函数,我不知道该怎么做。我可以通过引用或价值来传递它吗?我知道std::auto_ptr
如果我把它作为值而不是作为参考传递它是非常难看的。
所以:
void foo(cv::Ptr<cv::FeatureDetector> detector) { /*...*/ }
或
void foo(cv::Ptr<cv::FeatureDetector>& detector) { /*...*/ }
而且,如果我使用const
,有什么区别:
void foo(const cv::Ptr<cv::FeatureDetector> detector) { /*...*/ }
void foo(const cv::Ptr<cv::FeatureDetector>& detector) { /*...*/ }
答案 0 :(得分:4)
cv::Ptr
是类似指针的类型,这意味着它提供了引用语义。如果您的cv::Ptr
是const
,那么它只会让您const
访问它指向的对象。这实际上是一个奇怪的怪癖,因为普通指针和标准智能指针不能以这种方式工作。您的功能选择取决于您是否需要能够修改cv::FeatureDetector
。
如果您需要修改它,您的两个选择是:
void foo(cv::Ptr<cv::FeatureDetector> detector) { /*...*/ }
void foo(cv::Ptr<cv::FeatureDetector>& detector) { /*...*/ }
复制cv::Ptr
的开销可能很小(或者至少对您的程序没有影响)。我通常会将任何非const
引用参数视为&#34;输出参数&#34;,这表明cv::Ptr
本身将被修改。但是由于cv::Ptr
的怪癖,这真正意味着它允许cv::FeatureDetector
被修改。为了避免这种混淆,我更喜欢值参数。
我假设您正在使用C ++ 03,因为您提到了std::auto_ptr
,但如果您升级到C ++ 11并且OpenCV将移动构造函数添加到cv::Ptr
,那么您&# 39; ll也有移动语义的好处。
如果您想表示不会修改cv::FeatureDetector
,您可以制作参数const
。这可确保您不会修改函数内的cv::FeatureDetector
。您的选择是:
void foo(const cv::Ptr<cv::FeatureDetector> detector) { /*...*/ }
void foo(const cv::Ptr<cv::FeatureDetector>& detector) { /*...*/ }
第一个与外部的非const
值参数没有什么不同。
答案 1 :(得分:1)
cv::Ptr
是一个对象。
请参阅其他相关问题和答案:How to pass objects to functions in C++?