抽象跨平台实现的常用习惯是什么?

Dan*_*tor 3 c++ abstraction design-patterns idioms

我是一个旨在跨平台的程序; 因此,它将支持某些操作的多个实现.我的第一个想法是编写一个类的层次结构,具有一个通用接口,可能是每个平台的抽象工厂.

class Operation {
    DoOperation() = 0;
}

class OperationPlatform1 : public Operation {
    DoOperation();
}

class OperationPlatform2 : public Operation {
    DoOperation();
}

#ifdef USING_PLATFORM1
    Operation *op = new OperationPlatform1;
#endif
Run Code Online (Sandbox Code Playgroud)

但是,我意识到将在编译时使用将要使用的实现.我试着想一想如何使用静态多态实现这一点,之后我意识到我也可以按照这些方式写一些东西:

class OperationPlatform1 {
    DoOperation();
}

class OperationPlatform2 {
    DoOperation();
}

#ifdef USING_PLATFORM1
typedef OperationPlatform1 Operation;
#endif

Operation op;
Run Code Online (Sandbox Code Playgroud)

抽象多个实现的好方法是什么,其中只有一个在编译时被选中?我也对性能感兴趣,所以除非必须,否则我不想使用虚拟方法.

Jam*_*nze 5

通常的解决方案是只定义标题中的一个类,并为其提供不同的源文件,编译和链接任何必要的.如果您需要在类定义中使用某些依赖项(例如数据类型),则还可以通过为每个平台创建特定的头文件并将其包含在内来实现此目的.这里最简单的解决方案可能是为每个目标平台创建一个目录,并将所有平台相关文件放在那里,使用-I/ /I在编译时选择正确的目录(以及正确的平台相关文件).

过度使用#ifdef通常是设计不佳的标志.请参阅 https://www.usenix.org/legacy/publications/library/proceedings/sa92/sp​​encer.pdf.