首页 > 解决方案 > 具有容器类型之间转换的异构容器

问题描述

我有一个关于我要解决的问题的设计问题,我不确定您是否将其称为“异构容器”。我希望能够将不同的容器类型(共享公共属性)传递给函数,并在函数需要特定类型时定义类型之间的转换。

到目前为止,我认为这样做的方法是拥有一个抽象父类HetroContainer,特定类型从该类继承。具体类型可以通过 中定义的枚举来获取HetroContainer,其中每个枚举元素都是子容器类型的方便标签。

假设我有两个功能:

HetroContainer my_fun_a(HetroContainer input) {...}

HetroContainer my_fun_b(HetroContainer input) {...}

既取又取HetroContainer。但是,在内部my_fun_a处理比方说std::vectors,枚举 id VEC1,并my_fun_b处理一些其他类型,比如 Eigen 张量,或者一个std::vector但具有不同元素排序的东西,或者诸如此类的枚举 id VEC2

在伪代码中:

my_fun_X

  1. 采用通用容器输入
  2. 检查输入容器的数据是否是 my_fun_X 的首选类型
  3. 如果不是,则转换为该类型(可以/应该是新对象)
  4. 对容器的数据运行计算
  5. 返回容器

父类可能看起来像这样,需要向下转换才能访问数据:

enum TypeEnum{VECTOR_FMT1,
    VECTOR_FMT2,
          EIGEN};

class HetroContainer
{
public:
    HetroContainer(TypeEnum the_type,
                   int param1, int param2)
        :
        _the_type(the_type),
        _param1(param1), _param2(param2)
    {};

    TypeEnum the_type() const { return this->_the_type;};
    int param1() const { return this->_param1; };
    int param2() const { return this->_param2; };

    virtual void convert(HetroContainer input) = 0;
private:
    std::any _data;
    TypeEnum _the_type;
    int _param1;
    int _param2;
};

我的程序将处理my_fun_aand my_fun_b, (和 other my_fun_Xs)的组合。因此,如果我们有一个组合my_fun_a(my_fun_a(input)),那么第一步的第一步my_fun_a就是检查我们的组合HetroContainer是否是所需的类型VEC1

第一个my_fun_a()运行,并返回 a HetroContainer,它实际上是 a VEC1Container。我们的第二个my_fun_a采用HetroContainer, 并检查其基础类型是否为VEC1,因此我们无需费心进行转换。

在另一种情况下,my_fun_a(my_fun_b(input)),my_fun_a检查其输入的基础类型是什么。它会发现它不是它需要的格式(因为my_fun_b()处理了类型VEC2。因此,my_fun_a()必须首先调用相关的转换函数(VEC2 -> VEC1)将输入转换为它需要的格式。一旦转换完成,它会继续运行。

这个转换步骤不一定是简单的转换,并且需要手动实现每个类型到类型。我希望能够进行转换,这样如果我有一个来自A->Band的映射B->C,我的程序就可以推断出A->B->C可以执行。对于这些功能,我一直在看。

我一直在查看有关网络的 QA 论坛,但遇到了向下转换的问题。感觉整体设计可以更好地接近,但我不确定我应该寻找什么。任何建议,将不胜感激!

看过:

标签: c++

解决方案


推荐阅读