长时间以来,我一直在同时使用std::vector
和std::shared_ptr
。最近,每当需要指向一个const对象的指针时,我开始使用std::shared_ptr<const T>
。这样做是可以的,因为std::shared_ptr<T>
可以转换为std::shared_ptr<const T>
,然后它们共享相同的引用计数器,感觉很自然。
但当我尝试使用std::vector< std::shared_ptr<const T> >
等结构时,就会遇到问题。为了简化,我将这两个结构表示为:
template <class T>
using SharedPtrVector = std::vector< std::shared_ptr<T> >;
template <class T>
using SharedConstPtrVector = std::vector< std::shared_ptr<const T> >;
问题在于,尽管SharedPtrVector
和SharedConstPtrVector
非常相似,但SharedConstPtrVector
无法转换为SharedPtrVector
。
因此,每次我想要正确使用const并编写像这样的函数:
void f(const SharedConstPtrVector<T>& vec);
我无法将const SharedPtrVector<T>
传递给f
,没有任何办法。
我考虑过很多并且考虑了几种替代方案:
编写转换函数
template <typename T> SharedConstPtrVector<T> toConst(const SharedPtrVector<T>&);
以通用形式编写代码:
或者template <typename T> void f(const std::vector< std::shared_ptr<T> >& vec);
template <typename TIterator> void f(TIterator begin, TIterator end);
放弃使用
std::vector< std::shared_ptr<const T> >
的想法。
1.的问题是计算负担过重,代码变得更加丑陋。而2.则给代码带来了“一切都是模板”的风格。
我是一名经验不足的程序员,不想走错方向。我想听听有经验的人对这个问题的建议。
f
是一个算法,请将其变为模板使其通用=>可重复使用(作为数学家,您可能会喜欢 Alexander Stepanov 的方法)。 - dypдҪ д№ҹеҸҜд»ҘеңЁиҝҷйҮҢдҪҝз”ЁжҢҮй’ҲдҪңдёәиҝӯд»ЈеҷЁ
пјҢ然еҗҺдҪҝз”Ёstd::vector::data
жҲҗе‘ҳеҮҪж•°дј йҖ’еҗ‘йҮҸпјҹжҲ–иҖ…дҪ жҳҜжҖҺд№Ҳжғізҡ„пјҹ - Martin Drozdikvec.data()
和vec.data() + vec.size()
。 - dypstd::vector
和std::shared_ptr
,但这听起来好像我在误用它们。shared_ptr
不应该经常出现。 - user541686