首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用相同的底层数据结构处理不同的类型

使用相同的底层数据结构处理不同的类型
EN

Stack Overflow用户
提问于 2011-10-08 03:09:04
回答 2查看 156关注 0票数 2

我需要在计算机模拟中混合使用C代码和C++代码。

一个C库有一些函数,可以引用一个规则的双精度数组:

代码语言:javascript
复制
void position(double[3])

另一个C库定义了自己的vector类型:

代码语言:javascript
复制
void do_something(*custom_vector)

我的前端(在C++中)使用boost::numeric::ublas::vector

在第一种情况下,我有很多这样的代码:

代码语言:javascript
复制
double tmp[3];
position(tmp)
boostvec r(3);
r(0) = tmp[0]; r(1) = tmp[1]; r(2) = tmp[2];
// continue working with r

也是

代码语言:javascript
复制
custom_vector *v;
do_something(v);
boostvec r(3);
r(0) = v[0]; r(1) = v[1]; r(2) = v[2];

在内部,所有的类型最终都是矢量容器,但它们在实现上的细微差异导致了大量的样板爆炸。我也在处理许多不同版本的double (一些定义了realtype (这是一个双精度),另一些定义了number (这是一个双精度),等等)。

你是如何处理这种情况的?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-10-08 03:19:26

只要源类型和目标类型都支持标准迭代器接口(对于std::vector、数组和我能想到的所有Boost序列类型都是如此;所以您只需要修复您的custom_vector),并且只要在数字类型之间存在隐式转换,您就应该能够只使用std::copy

票数 2
EN

Stack Overflow用户

发布于 2011-10-08 03:45:16

如果你要在两种数据类型之间进行转换,你可能需要写很多样板书。不管你涂了多少口红,手术都是一样的。

当你看到像realtype这样的东西的typedefs时,对我来说,这是一种代码气味,有人太快地提取数据。围绕较低级别的数据编写抽象往往会使接口像这样“爆炸”。如果你以最愚蠢的方式使用数据容器,你通常会过得更好。不要用它们来保护不变量,只需要存储数据即可。在算法级别进行抽象,并以最简单的形式保留数据。

重构其他代码以使用一致的代码可能是有意义的,但通常是它的旧代码或外部代码。在你的新开发中,保持理智并使用向量。编写适配器在它们之间进行转换,只需让旧代码继续在您的外观后面进行转换即可。

为了避免这类问题变得非常笨拙,我最高兴的就是使用指针和长度。诚然,这与大多数建议背道而驰。

代码语言:javascript
复制
void foo(double *data, size_t len);

它导致了丑陋(和容易出错)的代码,但它是最小的公分母。如果你能把它隐藏在私有实现中,那显然会更好。

我只是写了很多不能重用的助手。结果,代码的局部性很糟糕,我的意图并不明显。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7691792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档