2

我需要在计算机模拟中将 C 代码与 C++ 代码混合。

AC 库具有引用常规双精度数组的函数:

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(这是一个双)等)。

你如何处理这种情况?

谢谢你。

4

2 回答 2

2

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

于 2011-10-07T19:19:26.163 回答
2

如果您要在这样的两种数据类型之间进行转换,您可能应该编写很多样板。不管你涂了多少口红,它总是会是同样的操作。

当您看到诸如 之类的 typedef 时realtype,对我来说这是一种代码异味,因为有人过早地抽象数据。在较低级别围绕数据编写抽象往往会使接口像这样“爆炸”。如果您以最愚蠢的方式使用数据容器,通常情况会更好。不要用它们保护不变量,只存储数据。在算法级别进行抽象,并以最简单的形式保留数据。

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

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

void foo(double *data, size_t len);

它产生丑陋(且容易出错)的代码,但它是最小的公分母。如果您可以将其隐藏在私有实现中,那显然会更好。

我刚刚写了很多无法重用的助手。结果,代码的局部性很差,我的意图并不明显。

于 2011-10-07T19:45:15.953 回答