C 共享库API中使用的数据类型
data types used in C++ shared library API
我正在编写一个C 共享库(.so
(,其主函数将是从OpenCV处理的图像中处理功能。但是,此共享库中的算法并非专门用于视觉 - 它可以接收雷达,激光雷达等的测量值
当我构建库时,我正在尝试将OpenCV依赖性远离它,而是使用更通用的EIGEN3矩阵库。
我的问题是关于应用程序代码和我的库之间的接口。我有一种公共方法,可以接受应用程序中每个功能的位置和速度测量列表:
void add_measurements(std::vector< std::tuple<double, double> > pos,
std::vector< std::tuple<double, double> > vel);
最好将数据结构放在API接口上,如上所述吗?还是我应该强制申请代码提供std::vector<Eigen::Vector2d>
进行测量?
此外,我应该允许从应用程序代码中允许std::vector<cv::Point2f>
,然后将CC_3转换为EIGEN3或内部的任何内容?这似乎是最不可用的,因为库仍将取决于opencv。
您可以使用仿制药桥接不同的数据约定而不牺牲性能。
缺点是接口的高等学习曲线。
首先,而不是接受向量您可以接受迭代器,它允许用户在其他容器中提供数据,例如 arrays 和列表。
template<typename AccessType, typename PosIter, typename VelIter>
void add_measurements(PosIter p1, PosIter p2, VelIter v1, VelIter v2)
{
// instantiate type to access coordinates
AccessType access;
// process elements
// Internal representation
std::vector<std::pair<double, double>> positions;
for(; p1 != p2; ++p1)
positions.emplace_back(access.x(*p1), access.y(*p1));
std::vector<std::pair<double, double>> velocities;
for(; v1 != v2; ++v1)
positions.emplace_back(access.x(*v1), access.y(*v1));
// do stuff with the data
}
那么,如果他们有这样的怪异数据类型,则要使用这样的数据类型:
struct WeirdPositionType
{
double ra;
double dec;
};
他们可以创建对 access 其内部点坐标的类型:
// class that knows how to access the
// internal "x/y" style data
struct WeirdPositionTypeAccessor
{
double x(WeirdPositionType const& ct) const { return ct.ra; }
double y(WeirdPositionType const& ct) const { return ct.dec; }
};
然后将"插入"到通用函数:
int main()
{
// User's weird and wonderful data format
std::vector<WeirdPositionType> ps = {{1.0, 2.2}, {3.2, 4.7}};
std::vector<WeirdPositionType> vs = {{0.2, 0.2}, {9.1, 3.2}};
// Plugin the correct Access type to pull the data out of your weirt type
add_measurements<WeirdPositionTypeAccessor>(ps.begin(), ps.end(), vs.begin(), vs.end());
// ... etc
}
当然,您可以为公共点库(例如 OpenCv
:
struct OpenCvPointAccess
{
double x(cv::Point2d const& p) const { return p.x; }
double y(cv::Point2d const& p) const { return p.y; }
};
然后使用可以简单地使用:
add_measurements<OpenCvPointAccess>(ps.begin(), ps.end(), vs.begin(), vs.end());
请记住,您可以超载功能以支持多种容器。如果您认为两者都有用,则无需在它们之间进行选择。
因此,主要考虑因素是每种方式进行操作的开销,以及是否要增加对特征的依赖。如果库的未来版本将具有不同的实现,则不想使用漏水的抽象。
另一个有用的技巧是添加类型的别名,例如在名称空间内:
using point2d = std::tuple<double, double>;
您以后可以更改为:
using point2d = Eigen::vector2d;
或:
using point2d = cv::Point2f;
您可以通过将它们包裹在结构中来使它们更不透明。如果这样做,未来的更改将与以前的ABI兼容,但不会打破API。
- 防止主数据类型C++的隐式转换
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在C++中打印指向不同基元数据类型的指针的内存地址
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何计算数据类型的范围,例如int
- C++中数据类型修饰符的顺序
- C++LinkedList问题.数据类型之间存在冲突?没有匹配的构造函数
- 特定数据类型的模板类
- 具有多个模板的模板函数,用于特定数据类型(如字符串)?
- 有没有办法提示用户使用哪种数据类型作为模板 c++
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 时间复杂度 当具有复合数据类型(如元组或对)时?
- 如何获取C++字符数据类型的地址
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 构造智能点数据类型以及普通数据类型的通用方法
- 如何使映射键具有两种不同的数据类型?
- 数据类型"struct seq<0, 1, 2>{}"含义是什么?
- C 共享库API中使用的数据类型
- 是否要确保一个线程修改的任何数据类型的共享变量对其他线程可见
- gSoap在接口之间共享数据类型