我有一个指向对象的 Boost 共享指针的 std::vector,我想得到一个指向相同对象的共享指针的 vector ,向下转换为更具体的类型:
//using boost::shared_ptr, std::vector;
vector<shared_ptr<A> > originalVec;
vector<shared_ptr<B> > targetVec( originalVec.size() ); // B extends A
对于单个元素 shared_ptr<A> elem
, 可以使用 boost::static_pointer_cast<B>(elem)
进行转换,其语法转载如下(来自 Boost shared_ptr doc ):
template<class T, class U>
shared_ptr<T> static_pointer_cast(shared_ptr<U> const & r); // never throws
我不知道如何将它与 std::transform
一起使用.我的尝试包括:
//using boost::bind, boost::static_pointer_cast
transform( originalVec.begin(), originalVec.end(), targetVec.begin(), bind( static_pointer_cast<B>, _1) )
transform( originalVec.begin(), originalVec.end(), targetVec.begin(), bind( static_pointer_cast<B,A>, _1) )
在这两种情况下都得到一个 "no matching function for call to bind(<unresolved overloaded function type>, boost::arg<1>& )"
有什么想法吗?
编辑: 该问题可能与歧义有关,因为为侵入式指针类定义了类似的函数模板,其语法为:
template<class T, class U>
intrusive_ptr<T> static_pointer_cast(intrusive_ptr<U> const & r); // never throws
在这种情况下,问题是如何指定第一个参数的类型,以便编译器知道选择哪个方法。
最佳答案
你通常可以通过指定你想要的函数指针的类型来告诉编译器你想要哪个重载,例如
typedef shared_ptr<B>(*func_type)(const shared_ptr<A>&);
transform( originalVec.begin(), originalVec.end(), targetVec.begin(), bind( (func_type)static_pointer_cast<B,A>, _1) );
但是如果你从无法消除歧义的重载函数中得到这种错误,我的首选解决方案通常是提供一个执行调用的自定义仿函数,以便编译器完成重载解析,并且您不必选择重载,例如
struct Downcast {
shared_ptr<B> operator()(const shared_ptr<A>& p) const
{ return shared_pointer_cast<B>(p); }
};
transform( originalVec.begin(), originalVec.end(), targetVec.begin(), Downcast() );
关于c++ - 使用 boost::bind 和 boost::static_pointer_cast 转换 boost::shared_ptr 的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17581433/