我需要在计算机模拟中混合使用C代码和C++代码。
一个C库有一些函数,可以引用一个规则的双精度数组:
void position(double[3])另一个C库定义了自己的vector类型:
void do_something(*custom_vector)我的前端(在C++中)使用boost::numeric::ublas::vector。
在第一种情况下,我有很多这样的代码:
double tmp[3];
position(tmp)
boostvec r(3);
r(0) = tmp[0]; r(1) = tmp[1]; r(2) = tmp[2];
// continue working with r也是
custom_vector *v;
do_something(v);
boostvec r(3);
r(0) = v[0]; r(1) = v[1]; r(2) = v[2];在内部,所有的类型最终都是矢量容器,但它们在实现上的细微差异导致了大量的样板爆炸。我也在处理许多不同版本的double (一些定义了realtype (这是一个双精度),另一些定义了number (这是一个双精度),等等)。
你是如何处理这种情况的?
谢谢。
发布于 2011-10-08 03:19:26
只要源类型和目标类型都支持标准迭代器接口(对于std::vector、数组和我能想到的所有Boost序列类型都是如此;所以您只需要修复您的custom_vector),并且只要在数字类型之间存在隐式转换,您就应该能够只使用std::copy。
发布于 2011-10-08 03:45:16
如果你要在两种数据类型之间进行转换,你可能需要写很多样板书。不管你涂了多少口红,手术都是一样的。
当你看到像realtype这样的东西的typedefs时,对我来说,这是一种代码气味,有人太快地提取数据。围绕较低级别的数据编写抽象往往会使接口像这样“爆炸”。如果你以最愚蠢的方式使用数据容器,你通常会过得更好。不要用它们来保护不变量,只需要存储数据即可。在算法级别进行抽象,并以最简单的形式保留数据。
重构其他代码以使用一致的代码可能是有意义的,但通常是它的旧代码或外部代码。在你的新开发中,保持理智并使用向量。编写适配器在它们之间进行转换,只需让旧代码继续在您的外观后面进行转换即可。
为了避免这类问题变得非常笨拙,我最高兴的就是使用指针和长度。诚然,这与大多数建议背道而驰。
void foo(double *data, size_t len);它导致了丑陋(和容易出错)的代码,但它是最小的公分母。如果你能把它隐藏在私有实现中,那显然会更好。
我只是写了很多不能重用的助手。结果,代码的局部性很糟糕,我的意图并不明显。
https://stackoverflow.com/questions/7691792
复制相似问题