我正在开发一个C ++库,用户将提供复杂的输入,例如 矩阵和四元数。我不想重新实现这些类型, 在内部,我将使用Eigen库。
我正在尝试决定将这些类型暴露给我的库的最佳方法 客户端并为我的API提供了一些选项。我使用四元数 键入作为示例,但这可以同样适用于矩阵等。也, 虽然我特别谈到暴露Eigen的类型,我猜这个 问题可以同样适用于其他使用的外部库。
1)仅使用基本的C ++类型
此选项要求客户端通过基本类型传递数据。对于 例如,对于传入四元数(4个元素),可以这样做:
void my_func(double my_quat[4])
2)暴露本征的类型
Eigen为数组和四元数提供了几种模板化类型。对于
例如,如果函数需要四元数,我可以使用Eigen的Quaterniond
type(实际上是Quaternion<double>
的typedef):
void my_func(const Eigen::Quaterniond& my_quat)
3)为客户的各种类型创建一个简单的包装器
我可以创建一个非常简单的四元数类型(比方说,某种简单的结构) 客户必须创建(可能通过某种工厂功能) 传递给我的API:
void my_func(const quaternion_t& my_quat)
我的库会将quaternion_t
类型转换为我的内部Eigen
表示。
我不太喜欢选项1因为我希望有更强烈的感觉 输入我的API。选项2也需要我的客户使用Eigen,而不是 提及兼容性的潜在问题,如果他们使用不同的 Eigen的版本(顺便说一句,Eigen是一个仅限标题的库,如果那样的话 事项)。这留下了选项3。
人们怎么想?我基本上回答了自己的问题吗?那里有什么例子吗?
相关问题
有人向here提出了一个相关问题,但没有真正详细说明是否应公开外部类型。
答案 0 :(得分:3)
在短期内公开第三方图书馆是最简单的,但从长远来看,最有可能在后面咬你。最容易的,因为那里的类型是alrady,你不需要想出自己的类型。如果你想在将来使用不同的实现库,或者想要允许扩展客户端传递给你的数据,会咬你。
仅使用基本类型就像提出自己的类型一样,但它的水平要低得多,没有充分的理由。您的用户将很难使用您的库,而无需经常参考有关内容的文档。
如果您想要灵活下线,使用您自己的类型是最佳选择。当你需要重新创建所有已经存在的类型时,它看起来似乎需要很多工作,但是如果你给它一些,你会发现如果你在库的界面中使用稍微不同的类型,它将有助于实现稍后改善。
所以答案真的取决于你的目标和长期计划/预测:如果你没有看到自己从现有的实施中改变,你可以重新使用现有的类型,但如果你预见/计划在未来的变化中,您应该创建自己的独立界面。
答案 1 :(得分:2)
包装/封装。假设您要添加一些其他功能,例如缓存计算结果(如四元数的范数)作为实现更改。如果您在不强制客户端代码更改其呼叫的情况下公开第三方类型,则不能(如此容易)这样做。