3

由于内存、性能和可移植性的原因,我们正在为我们的游戏开发的多平台引擎使用 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:: 宏,而不考虑使用什么实现。所以我对这个问题的处理是这样的:

#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

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

4

3 回答 3

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
}
于 2012-01-06T18:35:44.853 回答
5

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

namespace ginstl
{
#if (GIN_USE_EASTL)
    using namespace eastl;
#else
    using namespace std;
#endif
    using eastl::string
    using std::queue
}
于 2012-01-06T18:43:14.910 回答
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
于 2012-01-06T18:50:47.993 回答