对于要解决的问题,我有一个设计问题,我不确定您是否称其为“异构容器”。我希望能够将不同的容器类型(具有共同的属性)传递给函数,并在函数需要特定类型的情况下定义类型之间的转换。
到目前为止,我一直认为这样做的方法是拥有一个抽象的父类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
父类可能看起来像,其中需要向下转换才能访问数据:
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_a
和my_fun_b
(以及其他my_fun_X
)的组合。因此,如果我们有一个合成my_fun_a(my_fun_a(input))
,那么第一个my_fun_a
的第一步就是检查我们的HetroContainer
是否属于所需的类型VEC1
。
第一个my_fun_a()
运行,并返回一个HetroContainer
,它实际上是一个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->B
和B->C
的映射,我的程序可以推断出可以执行A->B->C
。对于这些功能,我一直在研究。
我一直在查看有关Web的质量检查论坛,但是遇到了垂头丧气的问题。感觉总体设计可能会更好,但是我不确定我应该寻找什么。任何建议将不胜感激!
看过: