【发布时间】:2021-11-22 17:04:53
【问题描述】:
我正在开发一个项目,该项目必须同时在 ros melodic (ubuntu 18.04) 和 ros noetic(ubuntu 20.04) 上运行。所以在这样做的同时,我在我的代码中做了一个 if-else 语句,
if(distro=="noetic"){
...do this
else
...do this
问题基本上出现了,noetic 和 melodic 支持不同版本的点云库(PCL),这也使得它们在初始化方式上有所不同。因此,当我在 if 语句和 else 语句中放入 PCL 初始化(提示支持的方式)时,我放入了旋律初始化方式。我希望编译器(我使用的 catkin_make 命令)只编译 if 语句,但它也编译 else 语句,这会给出错误,因为 noetic 不支持旋律初始化方式。应该怎么走?
【问题讨论】:
-
考虑到 PCL 依赖的不同,如果你想同时支持旋律和音符,你不应该尝试通过编译器来实现。解决这个问题的标准 ROS 方法是有一个单独的旋律和意念分支。
-
除此之外,这对于
if constexpr (...)来说可能是一个很好的用例,尽管这可能不会阻止编译器对另一个分支进行“事实检查”。也许您可以将初始化提取到一个单独的模板函数中并使用SFINAE(通过std::enable_if或使用decltype(something)返回值,其中something仅在两个库之一中有意义)过滤掉重载/没有意义的专业化。