繁体   English   中英

C ++ 11-编译时多态性解决方案

[英]C++11 - Compile time Polymorphism solutions

假设我正在编写一个跨平台的库,我必须以一种方式来组织代码,以使不同的平台具有不同的行为,并且该行为(或定义)是在编译时根据我的库所在的平台选择的正在编译。

在C ++中执行此操作的“常规”方法是在编写方法或类时使用大量#ifdef污染代码。

方法的问题是:

  • 源代码看起来真的很丑
  • 如果您支持3个平台,则您的源代码比实际需要的大约大3倍,这意味着您的编译器仍需要解析和分析所有代码以“查看” #ifdef
  • 在不同的实现之间没有真正的区别,当代码库增长时很难维护,而当您只有3-4个平台时,它的增长就非常快。

由于C ++ 11中有很多新功能,所以我想知道是否有所更改以及是否有新选项。

您应该使用构建系统来执行此操作。 您应该为标头提供与平台无关的函数声明和类定义。 然后,根据目标平台,构建系统应编译这些功能和类的适当实现。

例如,让我们考虑创建用于显示图形或GUI元素的窗口。 如果您不使用库来执行此操作,则必须自己编写跨平台代码。 首先,您应该仔细考虑与平台无关的接口。 也许您有一个window类和一些辅助函数。 然后,您可以在头文件中提供该类的定义和帮助程序函数的声明,并为每个平台提供单独的实现。 然后,您将获得一组像这样的文件:

  • window.h
  • window_wayland.cpp
  • window_winapi.cpp
  • window_x11.cpp

现在,所有需要使用您的类和函数的文件都应该只是#include <window.h> 它们都获得相同的函数声明。 但是,你在构建系统的配置指定window_x11.cpp应与X11系统,系统编译window_wayland.cpp对系统的韦兰和window_winapi在Windows上。 这意味着,根据您所构建的平台,您将获得在目标平台上工作的标头的实现。

这有很多优点:

  1. 您已经将构建关注点(要针对哪个平台构建)与代码关注点分开了。
  2. 每个平台相关的实现都有其自己的文件。
  3. 您不会因预处理指令而混乱,并且很难遵循执行路径。

这并不意味着使用定义有选择地编译代码的不同部分没有任何问题。 我更喜欢仅使用少量已本地化至与平台相关的部分的代码来查看此内容。 理想情况下,将平台相关的代码包装在一个函数中,并让#ifdef换出实现。

究竟如何进行选择性构建,取决于您使用的构建系统。 对于GNU构建系统,可以使用automake实现条件编译。 文档中提供了一些示例 给出的一个简单示例是:

bin_PROGRAMS = hello
if LINUX
hello_SOURCES = hello-linux.c hello-common.c
else
hello_SOURCES = hello-generic.c hello-common.c
endif

使用此配置运行automake将生成适当的makefile。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM