运行时的函数指针
背景
我正在开发一个独立于平台(Linux、macOS 和 Windows)的科学成像应用程序,该应用程序实现了各种专业相机,并且这些相机中的每一个都有一个制造商提供的 SDK。我目前正在实施一系列新相机,这些相机由一家公司制造,但由其他制造商使用单独的 SDK 进行品牌推广。
除了 SDK 函数名称的细微差别外,公共接口是相同的。也就是说,一切都一样(函数返回类型和签名等)。唯一的区别是函数名称的开头。
SDK 公共接口示例
int company_1_count_cameras();
bool company_1_init_camera(...);
bool company_1_connect_camera(...);
和:
int company_2_count_cameras();
bool company_2_init_camera(...);
bool company_2_connect_camera(...);
我希望能够为所有 OEM 相机使用一种实现,但要考虑到功能名称的差异。我已经尝试在预处理器定义中使用函数指针,这部分有效。到目前为止,我已经完成了以下工作:
我已将以下内容放入包含文件中:
#define FP( func ) company_2 ## func
在实施中,我做了:
int count = FP(count());
但是,我不确定如何执行此操作,以便我可以编译我的项目以支持所有不同的相机。任何人都可以就实现这一目标的最佳方法提供任何建议吗?
非常感谢阿曼达
回答
一种更正式的 C++ 方式是定义一个接口定义类:
struct company_interface {
int (*count_cameras)();
bool (*init_camera)(...);
bool (*connect_camera)(...);
};
然后为每个公司实例化一个单独的实例:
const company_interface company_1{
&company_1_count_cameras,
&company_1_init_camera,
&company_1_connect_camera
};
const company_interface company_2{
&company_2_count_cameras,
&company_2_init_camera,
&company_2_connect_camera
};
在这一点上,有许多不同的可能的设计决策,从传递 aconst company_interface &到任何需要对相机做某事的地方,或者使company_interface自己成为一个实现高级功能的大类。
这种方法的优点是实际相机特定的 API 只在定义接口定义类实例的翻译单元中需要。其他一切只需要接口类的声明,它会直接通过函数指针调用相机API,而不需要在每个需要调用的翻译单元中包含每个相机API的声明。
另外,现在模拟一个模拟相机 API 的单元测试框架是微不足道的。