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

标签 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 的来源。
我们正在使用列表、 vector ……像这样

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

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

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

这就是我在这里发帖的原因,因为这不是最佳的!我想做的是对引擎中的所有内容使用 ginSTL::宏,而不考虑使用什么实现。所以我对这个问题的处理方法是:

#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

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

最佳答案

关于使用命名空间:

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
}

关于c++ - 在 C++ 中使用#define 宏从不同的命名空间中选择实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8762636/

相关文章:

c++ - 打开 COM 端口时调试断言失败

c++ - std::map 插入 && 重载导致复制

c++ - 如何禁止或阻止堆栈分配变量的传递?

c++ - STL 字符串中的别名

PHP - 命名空间无法正常工作

C++单个变量来处理来自用户的多个类

c++ - 如何使用 BOOST_HANA_ADAPT_ADT 定义 get/set 对?

c++ - 如何在不构造 key_type 对象的情况下在 std::multiset 中进行二进制搜索?

c++ - 将函数限制在命名空间

ubuntu - 基于名称的虚拟主机来识别 Ubuntu Apache LAMP 服务器上的不同 SSL 虚拟主机?