在C ++中使用#define宏来从不同的命名空间中选择实现

时间:2012-01-06 18:29:20

标签: c++ stl namespaces c-preprocessor eastl

我们为游戏开发的多平台引擎使用EASTL来替换STL,因为内存,性能和可移植性原因。 EASTL可以在这里找到:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2271.html

因为Visual Studio非常适合调试STL,所以当引擎处于开发阶段时,我们不会在Windows上使用EASTL。还有一些STL容器如std :: queue,std :: deque,...在EASTL中不可用。因为我们在Windows上使用eastl :: string并不重要,因为它适合调试。

我们到目前为止所做的是

#if (GIN_USE_EASTL)
    #define ginstl eastl
#else
    #define ginstl std
#endif

和GIN_USE_EASTL在Windows上定义为0。 引擎被称为Ginkgo,即GIN来自的地方。
我们正在使用列表,向量......就像这样

ginstl::list myList;
ginstl::vector myVector;

工作得很好。但是当我们使用字符串或队列时,由于我上面解释的原因,我们必须编写

eastl::string myString;
std::queue myQueue;

这就是我在这里发帖的原因,因为这不是最佳的!我想要做的是将ginstl :: macro用于引擎中的所有内容,而不考虑要使用的实现。所以我对这个问题的处理是:

#if (GIN_USE_EASTL)
    #define ginstl::list eastl::list
    #define ginstl::vector eastl::vector
    #define ginstl::string eastl::string
    #define ginstl::queue std::queue
#else
    #define ginstl::list std::list
    #define ginstl::vector std::vector
    #define ginstl::string eastl::string
    #define ginstl::queue std::queue
#endif

但不幸的是,因为#define宏中不允许使用::。 有没有办法实现相同的东西(能够指定我想用于特定数据结构的实现)某种程度上不同?我可以去

#define ginstl_list eastl::list

但我更喜欢上面的结构!是否有办法(除了编写自定义预处理器)解决问题?

3 个答案:

答案 0 :(得分:6)

using namespace

怎么样?
namespace ginstl
{
#if (GIN_USE_EASTL)
    using eastl::list
    using eastl::vector
    using eastl::string
    using std::queue
#else
    using std::list
    using std::vector
    using eastl::string
    using std::queue
#endif
}

答案 1 :(得分:5)

在Mark B的方式上进一步发展(无需列出所有使用的类型):

namespace ginstl
{
#if (GIN_USE_EASTL)
    using namespace eastl;
#else
    using namespace std;
#endif
    using eastl::string
    using std::queue
}

答案 2 :(得分:3)

如果使用命名空间别名而不是宏:

#if (GIN_USE_EASTL)
    namespace ginstl = eastl;
#else
    namespace ginstl = std;
#endif

然后你可以这样做:

using namespace ginstl;
using std::queue;
using std::deque;

list<int> x; // from eastl or std, depending on GIN_USE_EASTL
queue<int> y; // always from std