异构容器,在容器类型之间进行转换

时间:2019-02-11 17:22:42

标签: c++

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

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

说我有两个功能:

HetroContainer my_fun_a(HetroContainer input) {...}

HetroContainer my_fun_b(HetroContainer input) {...}

两者都取回HetroContainer。但是,内部my_fun_a处理std::vector,枚举ID VEC1,而my_fun_b处理某种其他类型,例如本征张量或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_amy_fun_b(以及其他my_fun_X)的组合。因此,如果我们有一个合成my_fun_a(my_fun_a(input)),那么第一个my_fun_a的第一步就是检查我们的HetroContainer是否属于所需的类型VEC1

第一个my_fun_a()运行,并返回一个HetroContainer,它实际上是一个VEC1Container。我们的第二个my_fun_aHetroContainer,并检查其基础类型为VEC1,因此我们不必费心转换。

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

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

我一直在查看有关Web的质量检查论坛,但是遇到了垂头丧气的问题。感觉总体设计可能会更好,但是我不确定我应该寻找什么。任何建议将不胜感激!

看过:

0 个答案:

没有答案