5

我正在开发一个 C++ 库,用户将在其中提供复杂的输入,例如矩阵和四元数。我不想重新实现这些类型,所以在内部,我将使用Eigen库。

我正在尝试确定将这些类型公开给我的库客户端的最佳方式,并为我的 API 提供了一些选项。我以四元数类型为例,但这同样适用于矩阵等。此外,虽然我专门谈论公开 Eigen 的类型,但我想这个问题同样适用于正在使用的其他外部库。

1) 只使用基本的 C++ 类型

此选项将要求客户端通过基本类型传入数据。例如,要传入一个四元数(4 个元素),可以这样做:

void my_func(double my_quat[4])

2) 暴露 Eigen 的类型

Eigen 为数组和四元数提供了几种模板类型。例如,如果一个函数需要一个四元数,我可以使用 Eigen 的Quaterniond 类型(它实际上是 的 typedef Quaternion<double>):

void my_func(const Eigen::Quaterniond& my_quat)

3)为客户的各种类型创建一个简单的包装器

我可以创建一个非常简单的四元数类型(例如,某种简单的结构),客户端必须创建(可能通过某种工厂函数)才能传递给我的 API:

void my_func(const quaternion_t& my_quat)

我的库会将quaternion_t类型转换为我的内部特征表示。

我不太喜欢选项 1,因为我希望在我的 API 中有更强的打字感。选项 2 将要求我的客户也使用 Eigen,更不用说如果他们使用不同版本的 Eigen 时可能存在的兼容性问题(顺便说一下,如果重要的话,Eigen 是一个仅限标头的库)。剩下的选项3。

人们怎么看?我基本上回答了我自己的问题吗?有什么例子吗?

相关问题

此处提出了一个相关问题,但并未真正详细说明是否应该公开外部类型。

4

2 回答 2

3

暴露 3rd 方库在短期内是最容易的,但从长远来看很可能会在后面咬你一口。最简单,因为类型已经存在,你不需要自己想出。如果您将来想要使用不同的实现库,或者想要允许扩展客户端传递给您的数据,将会咬您一口。

只使用基本类型几乎就像想出你自己的一样,但它的级别要低得多,没有充分的理由。如果不经常参考有关内容的文档,您的用户将很难使用您的库。

如果您想要灵活性,使用您自己的类型是最好的选择。由于您需要重新创建所有已经存在的类型,这似乎需要大量的工作,但是如果您给它一些努力,您可能会发现如果您在库的接口中使用稍微不同的类型,它将有助于实现以后改得更好。

所以答案真的取决于你的目标和长期计划/预测:如果你没有看到自己从当前的实现中改变,你可以重新使用现有的类型,但是如果你预见/计划改变将来,您应该创建自己的独立界面。

于 2012-05-14T01:45:03.603 回答
2

包裹/封装。假设您想添加一些附加功能,例如缓存计算结果,例如四元数的范数,作为实现更改。如果您在不强制您的客户端代码更改其调用的情况下公开第 3 方类型,则无法做到这一点(很容易)。

于 2012-05-14T01:20:24.257 回答