运行时的函数指针

背景

我正在开发一个独立于平台(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());

但是,我不确定如何执行此操作,以便我可以编译我的项目以支持所有不同的相机。任何人都可以就实现这一目标的最佳方式提供任何建议吗?

非常感谢 阿曼达

Lephia 回答:运行时的函数指针

更正式的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
};

此时有许多不同的可能设计决策,从在需要对相机做某事的地方传递 const company_interface &,或者使 company_interface 本身成为一个实现高级功能的大类.

这种方法的优点是实际相机特定的 API 只在定义接口定义类实例的翻译单元中需要。其他一切只需要接口类的声明,它会直接通过函数指针调用相机API,不需要在每个需要调用的翻译单元中包含每个相机API的声明。

另外,现在模拟一个模拟相机 API 的单元测试框架是微不足道的。

,

您可以使您的 FP 宏依赖于特定于平台的宏,如下所示:

#if defined _WIN32
# define FP(...) win32_##__VA_ARGS__
#elif defined __linux__
# define FP(...) linux_##__VA_ARGS__
#elif defined __APPLE__
# define FP(...) apple_##__VA_ARGS__
#else
 static_assert(false,"Unsupported configuration");
#endif

查看更多特定于平台的宏 here

请注意,这与函数指针无关。

本文链接:https://www.f2er.com/1311.html

大家都在问