gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:43:25 31 4
gpt4 key购买 nike

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

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com