c++ - 使用 boost::bind 和 boost::static_pointer_cast 转换 boost::shared_ptr 的 vector

标签 c++ boost stl shared-ptr boost-bind

我有一个指向对象的 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/

相关文章:

c++ - 为带有 &argument 的调用编写函数头

C++11(或 Boost)system_error 策略

c++ - 检查map<string, string>是否包含另一个map<string, string>

c++ - 从容器中删除元素的单语句方法

c++ - std::getline() 如何等同于 bool?

c++ - 检测分组词的最佳方法

C++ 错误 : identifier "CWnd" is not defined

c++ - 如何轻松地将 LPBYTE 转换为 char[256](用于从 Windows 注册表中读取文本)

c++ - boost tokenizer 的随机行为

c++ - 为什么 boost::any 不保存字符串文字?