c++ - 指向基本类型的指针的 vector ,找到存储在基本类型中的给定派生类型的所有实例

标签 c++ boost base-class

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

class A {};

和派生类
class B: public A {};
class C: public A {};

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

用户添加BC实例是由用户完成的,无法预先确定添加顺序。

但是,在库内部,可能需要对BC执行特定操作,因此需要将指向基类的指针转换为BC

我当然可以进行“尝试和错误”转换,即尝试转换为BC(以及基类的任何其他派生类),直到找到不会抛出的转换为止。但是,此方法似乎非常粗糙且容易出错,因此我正在寻找一种更优雅(且性能更好)的方法。

我正在寻找一种也可与C++ 98一起使用的解决方案,但可能涉及增强功能。

有任何想法吗 ?

编辑:

好的,谢谢您提供的所有答案!

我想提供有关用例的更多详细信息。所有这些都是在参数优化的情况下发生的。

用户通过以下方式定义优化问题:
  • 指定参数,即参数的类型(例如“约束 double ”,“约束整数”,“无约束 double ”,“ bool(boolean) 值”等)和初始值
  • 指定评估函数,该函数将一个或多个评估(双值)分配给给定的参数集

  • 然后,不同的优化算法将对问题定义(包括其参数)起作用。

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

    问题定义是用户定义的C++类,它是从具有std::vector接口(interface)的基类派生的。用户添加他的(预定义或本地生成的)参数对象,并且使健身功能过载。

    可能会访问参数对象

    优化算法中的
  • (通常也可以用于本地参数对象,因为派生的参数对象需要为其值提供访问函数)。
  • 用户提供的适应性函数中的
  • (通常为OK,因为用户知道在哪里可以轻松访问集合中的哪个参数对象及其值)

    这很好。

    但是,在某些特殊情况下,
  • 用户想要访问其自己的参数类型
  • 的详细信息
  • 第三方提供了参数结构(这是一个开放源代码库,其他人可能会添加针对特定优化问题的代码)
  • 作为优化问题的一部分,可以修改参数结构(即参数在 vector 中的位置)->示例:训练神经网络的结构

  • 在这种情况下,最好有一种简单的方法来访问基本类型集合内给定派生类型的所有参数对象。

    我已经有一个模板化的“conversion_iterator”。它遍历基础对象的 vector ,并跳过那些不符合所需目标类型的对象。但是,这是基于“反复试验”的转换(即,我检查转换后的智能指针是否为NULL),我发现该转换非常简单且容易出错。

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

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

    最佳答案

    没有比尝试投射并查看其是否成功更好的通用解决方案。您可以选择派生动态typeid并将其依次与所有类型进行比较,但这实际上是相同的工作量。

    从根本上讲,您需要这样做会暗示一个设计问题:基类的整个目的是要能够像对待 parent 一样对待 child 。不过,在某些情况下有必要这样做,在这种情况下,您可以使用visitor进行分发。

    关于c++ - 指向基本类型的指针的 vector ,找到存储在基本类型中的给定派生类型的所有实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23325469/

    相关文章:

    c++ - 如何为股票创建一个类?

    c++ - std::function 复制构造函数是否要求模板类型参数类型是完整类型?

    c++ - 将嵌套的 C 循环转换为单个 boost 索引?

    c++ - 取消引用时销毁对象

    c++ - unique_ptr 矩阵

    c++ - 在哪里可以找到 boost::fusion 文章、示例、指南、教程?

    c# - 重铸为派生类型

    c++将子类添加到基类数组?

    c++ - 如何编写接受 std::vector 或 std::list 的函数?

    c++ - 使用谓词模板函数从此处错误实例化