【发布时间】:2012-05-21 12:53:33
【问题描述】:
我正在开发一个 C++ 库,用户将在其中提供复杂的输入,例如 矩阵和四元数。我不想重新实现这些类型,所以, 在内部,我将使用Eigen 库。
我正在尝试确定将这些类型公开给我的库的最佳方式' 客户,并为我的 API 提供了一些选项。我使用四元数 以 type 为例,但这同样适用于矩阵等。还, 虽然我是在专门谈论暴露 Eigen 的类型,但我猜这个 问题同样适用于正在使用的其他外部库。
1) 仅使用基本 C++ 类型
此选项将要求客户端通过基本类型传入数据。为了 例如,要传入一个四元数(4 个元素),可以这样做:
void my_func(double my_quat[4])
2) 公开 Eigen 的类型
Eigen 为数组和四元数提供了几种模板类型。为了
例如,如果一个函数需要一个四元数,我可以使用 Eigen 的 Quaterniond
类型(实际上是 Quaternion<double> 的 typedef):
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。
人们怎么看?我基本上回答了我自己的问题吗?有什么例子吗?
相关问题
here 提出了一个相关问题,但并未真正详细说明是否应该 公开外部类型。
【问题讨论】:
-
选项 3 怎么样,构造函数同时采用选项 1 和 2? C++ 语义允许您很好地转发声明类型以使其工作(没有 Eigen 的客户端仍然可以包含标头并且不会在编译时失败)。
-
我正在考虑类似的事情,但我想我对如何转发声明 typedef'd 模板类型有点模糊,尽管我想在我的情况下我可能会限制客户通过类型的特定实例化(例如
Quaternion<double>而不是Quaternion<int>)。 -
如果客户使用构造函数将我的库的类型从他们的 Eigen 类型中创建出来,我也有点模糊,但是他们使用的是不同版本的 Eigen,比如说,有轻微的实施变化。