c++ - 具有容器类型之间转换的异构容器
问题描述
我有一个关于我要解决的问题的设计问题,我不确定您是否将其称为“异构容器”。我希望能够将不同的容器类型(共享公共属性)传递给函数,并在函数需要特定类型时定义类型之间的转换。
到目前为止,我认为这样做的方法是拥有一个抽象父类HetroContainer
,特定类型从该类继承。具体类型可以通过 中定义的枚举来获取HetroContainer
,其中每个枚举元素都是子容器类型的方便标签。
假设我有两个功能:
HetroContainer my_fun_a(HetroContainer input) {...}
HetroContainer my_fun_b(HetroContainer input) {...}
既取又取HetroContainer
。但是,在内部my_fun_a
处理比方说std::vector
s,枚举 id VEC1
,并my_fun_b
处理一些其他类型,比如 Eigen 张量,或者一个std::vector
但具有不同元素排序的东西,或者诸如此类的枚举 id VEC2
。
在伪代码中:
my_fun_X
- 采用通用容器输入
- 检查输入容器的数据是否是 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
and my_fun_b
, (和 other my_fun_X
s)的组合。因此,如果我们有一个组合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->B
and的映射B->C
,我的程序就可以推断出A->B->C
可以执行。对于这些功能,我一直在看。
我一直在查看有关网络的 QA 论坛,但遇到了向下转换的问题。感觉整体设计可以更好地接近,但我不确定我应该寻找什么。任何建议,将不胜感激!
看过:
解决方案
推荐阅读
- flutter - 如何从 List Flutter 中的 Map 中检索值?
- ios - ios模拟器打不开,怎么解决?
- time-series - facebook 先知预测未来固定日期的价值
- git - Docusaurus 发布-gh-pages
- amazon-web-services - 使用 SNSEvent *和* 配置 Lambda 使用协议创建订阅:lambda 只生成一个订阅,但是哪个?
- javascript - 对象属性未定义且无法获取计数
- r - 生成以 000000 为起始值的数字序列
- c# - 如何为我的 OPC UA 服务器中的节点实例分配值(C# 代码)
- java - 从 Android 中的相机或画廊上传照片
- javascript - 如何设置组件专注于负载