#define包括硬件光标的替代品?

时间:2013-07-18 15:52:51

标签: c++ cross-platform c-preprocessor

我正在研究的这个程序有一个3D(硬件/非硬件)光标选项,我正在尝试为其配置选项。现在,它使用预处理器#define宏进行设置,该宏设置CursorType,CursorName和CursorDisplay的类型。目前,我可以打开或关闭3D光标的唯一方法是注释或取消注释#define USE_3D_CURSOR行(非常糟糕)。

#define USE_3D_CURSOR
#if defined (USE_3D_CURSOR)
  #include <osgDB/ReadFile>
  #define CursorType osg::Image *
  #define CursorName const stringobj& 
  #define CursorDisplay osg::Texture *
#elif defined (_MSC_VER)
  #include <windows.h>
  #include <osgViewer/api/Win32/GraphicsWindowWin32>
  #define SLASH "\\"
  #define CursorType HCURSOR
  #define CursorName LPTSTR
  #define CursorDisplay HMODULE
#elif defined(__linux__)
  //...

正如我之前所说的,我想将其更改为可在运行时之前设置的配置文件选项。但是,我不确定这样做的最佳方法是什么。我应该使用模板化函数吗?

1 个答案:

答案 0 :(得分:3)

根据定义,这是不可能的,因为在编译期间始终会评估#define#include语句。

你需要一种操作系统抽象层,而不是#define CursorType等。

换句话说:定义抽象接口以描述游标特定行为,并为这些行为提供特定于操作系统的实现。使用工厂模式在编译时实例化正确的实现,使用该接口在运行时配置特定的行为和功能和属性。

我建议您阅读FactoryFacadeDecorator模式。恕我直言,整个事情有点过于复杂,无法在这里为您提供代码示例(可能我现在太懒了)。如果是这样。否则得到我的意思,并且愿意给予一个,或者有一个很好的资源来获得这样的抽象层,感觉自由!