小编use*_*757的帖子

指向基类型的指针向量,查找存储在基类型中的给定派生类型的所有实例

假设您在库中有一个基类:

class A {};
Run Code Online (Sandbox Code Playgroud)

和派生类

class B: public A {};
class C: public A {};
Run Code Online (Sandbox Code Playgroud)

现在实例BC存储在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)

增加的情况下,BC由用户完成的,并没有办法事先确定的顺序,其中它们将被添加.

然而,图书馆内,有可能需要执行的具体行动BC,因此需要被浇铸成指向基类BC.

我当然可以进行"试错"转换,即尝试转换为BC(以及基类的任何其他衍生物),直到找到不抛出的转换.然而,这种方法看起来非常粗糙且容易出错,我正在寻找一种更优雅(更好的表现)方式.

我正在寻找一个也适用于C++ 98的解决方案,但可能涉及增强功能.

有任何想法吗 ?


编辑:

好的,谢谢你到目前为止的所有答案!

我想提供一些有关用例的更多细节.所有这些都发生在参数优化的背景下.

用户通过以下方式定义优化问题

  • 指定参数,即它们的类型(例如"约束双精度","约束整数","无约束双精度","布尔值"等)和初始值
  • 指定评估函数,该函数将一个或多个评估(双精度值)分配给给定的参数集

然后,不同的优化算法对问题定义起作用,包括它们的参数.

对于常见情况,有许多预定义的参数对象,但用户也可以通过从我的一个基类派生来创建自己的参数对象.因此,从库的角度来看,除了参数对象需要符合给定(基类)API之外,我不能对参数对象有太多假设.

问题定义是用户定义的C++类,派生自带有std :: vector接口的基类.用户添加他的(预定义的或本地生成的)参数对象并重载健身功能.

可能会发生对参数对象的访问

  • 从优化算法中(通常可以,即使对于自行生成的参数对象,因为派生参数对象需要为其值提供访问函数).
  • 来自用户提供的健身功能(通常没问题,因为用户知道在哪里可以找到集合中的哪个参数对象,并且可以轻松访问其值)

这很好用.

然而,可能有特殊情况

  • 用户想要访问其本土参数类型的细节
  • 第三方提供了参数结构(这是一个开源库,其他人可能会为特定的优化问题添加代码)
  • 参数结构(即哪些参数在向量中的位置)可以作为优化问题的一部分进行修改 - >示例:训练神经网络的体系结构

在这种情况下,有一个简单的方法可以访问基类型集合中给定派生类型的所有参数对象.

我已经有一个模板化的"conversion_iterator".它迭代基础对象的向量,并跳过那些不符合所需目标类型的对象.但是,这是基于"试错"转换(即我检查转换的智能指针是否为NULL),我发现它非常不优雅且容易出错.

我希望有一个更好的解决方案.

注意:优化库的目标是用例,其中给定参数集的评估步骤可能持续任意长(通常为几秒,可能是几小时或更长).因此,访问参数类型的速度不是很大的问题.但稳定性和可维护性是......

c++ boost base-class

2
推荐指数
1
解决办法
326
查看次数

标签 统计

base-class ×1

boost ×1

c++ ×1