假设您在库中有一个基类:
class A {};
Run Code Online (Sandbox Code Playgroud)
和派生类
class B: public A {};
class C: public A {};
Run Code Online (Sandbox Code Playgroud)
现在实例B
和C
存储在std :: vector中boost::shared_ptr<A>
:
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()));
Run Code Online (Sandbox Code Playgroud)
增加的情况下,B
和C
由用户完成的,并没有办法事先确定的顺序,其中它们将被添加.
然而,图书馆内,有可能需要执行的具体行动B
和C
,因此需要被浇铸成指向基类B
和C
.
我当然可以进行"试错"转换,即尝试转换为B
和C
(以及基类的任何其他衍生物),直到找到不抛出的转换.然而,这种方法看起来非常粗糙且容易出错,我正在寻找一种更优雅(更好的表现)方式.
我正在寻找一个也适用于C++ 98的解决方案,但可能涉及增强功能.
有任何想法吗 ?
编辑:
好的,谢谢你到目前为止的所有答案!
我想提供一些有关用例的更多细节.所有这些都发生在参数优化的背景下.
用户通过以下方式定义优化问题
然后,不同的优化算法对问题定义起作用,包括它们的参数.
对于常见情况,有许多预定义的参数对象,但用户也可以通过从我的一个基类派生来创建自己的参数对象.因此,从库的角度来看,除了参数对象需要符合给定(基类)API之外,我不能对参数对象有太多假设.
问题定义是用户定义的C++类,派生自带有std :: vector接口的基类.用户添加他的(预定义的或本地生成的)参数对象并重载健身功能.
可能会发生对参数对象的访问
这很好用.
然而,可能有特殊情况
在这种情况下,有一个简单的方法可以访问基类型集合中给定派生类型的所有参数对象.
我已经有一个模板化的"conversion_iterator".它迭代基础对象的向量,并跳过那些不符合所需目标类型的对象.但是,这是基于"试错"转换(即我检查转换的智能指针是否为NULL),我发现它非常不优雅且容易出错.
我希望有一个更好的解决方案.
注意:优化库的目标是用例,其中给定参数集的评估步骤可能持续任意长(通常为几秒,可能是几小时或更长).因此,访问参数类型的速度不是很大的问题.但稳定性和可维护性是......