假设您在库中有一个基类:
class A {};
和派生类
class B: public A {};
class C: public A {};
现在,
B
和C
的实例存储在boost::shared_ptr<A>
的std::vector中:std::vector<boost::shared_ptr<A> > A_vec;
A_vec.push_back(boost::shared_ptr<B>(new B()));
A_vec.push_back(boost::shared_ptr<C>(new C()));
用户添加
B
和C
实例是由用户完成的,无法预先确定添加顺序。但是,在库内部,可能需要对
B
和C
执行特定操作,因此需要将指向基类的指针转换为B
和C
。我当然可以进行“尝试和错误”转换,即尝试转换为
B
和C
(以及基类的任何其他派生类),直到找到不会抛出的转换为止。但是,此方法似乎非常粗糙且容易出错,因此我正在寻找一种更优雅(且性能更好)的方法。我正在寻找一种也可与C++ 98一起使用的解决方案,但可能涉及增强功能。
有任何想法吗 ?
编辑:
好的,谢谢您提供的所有答案!
我想提供有关用例的更多详细信息。所有这些都是在参数优化的情况下发生的。
用户通过以下方式定义优化问题:
然后,不同的优化算法将对问题定义(包括其参数)起作用。
对于常见情况,有许多预定义的参数对象,但是用户也可以通过派生自我的基类之一来创建自己的参数对象。因此,从库的 Angular 来看,除了参数对象需要符合给定的(基类)API的事实外,我不能对参数对象做太多假设。
问题定义是用户定义的C++类,它是从具有std::vector接口(interface)的基类派生的。用户添加他的(预定义或本地生成的)参数对象,并且使健身功能过载。
可能会访问参数对象
优化算法中的
这很好。
但是,在某些特殊情况下,
在这种情况下,最好有一种简单的方法来访问基本类型集合内给定派生类型的所有参数对象。
我已经有一个模板化的“conversion_iterator”。它遍历基础对象的 vector ,并跳过那些不符合所需目标类型的对象。但是,这是基于“反复试验”的转换(即,我检查转换后的智能指针是否为NULL),我发现该转换非常简单且容易出错。
我希望有一个更好的解决方案。
注意:优化库针对用例,其中给定参数集的评估步骤可能会持续很长时间(通常是几秒钟,可能是几小时或更长时间)。因此,访问参数类型的速度不是什么大问题。但是稳定性和可维护性是...
最佳答案
没有比尝试投射并查看其是否成功更好的通用解决方案。您可以选择派生动态typeid
并将其依次与所有类型进行比较,但这实际上是相同的工作量。
从根本上讲,您需要这样做会暗示一个设计问题:基类的整个目的是要能够像对待 parent 一样对待 child 。不过,在某些情况下有必要这样做,在这种情况下,您可以使用visitor进行分发。
关于c++ - 指向基本类型的指针的 vector ,找到存储在基本类型中的给定派生类型的所有实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23325469/