在C++中使用#define宏可以从不同的命名空间中选择实现
Use #define macro in C++ to choose implementations from different namespaces
由于内存、性能和可移植性的原因,我们为游戏开发的多平台引擎使用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::字符串并不重要,因为它可以进行调试。
到目前为止,我们正在做的是
#if (GIN_USE_EASTL)
#define ginstl eastl
#else
#define ginstl std
#endif
并且GIN_USE_EASTL在窗口上被定义为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
但我更喜欢上面的结构!有没有办法解决这个问题(除了编写自定义预处理器)?
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
}
在Mark B的基础上进一步开发(无需列出所有使用的类型):
namespace ginstl
{
#if (GIN_USE_EASTL)
using namespace eastl;
#else
using namespace std;
#endif
using eastl::string
using std::queue
}
如果使用命名空间别名而不是宏:
#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
相关文章:
- 在运行时选择父类的实现
- 如何在类中实现可选择的类似命名空间的功能?
- 如何实现链表并允许用户选择要使用 C++ 删除的特定节点?
- 在运行时选择要使用的 CRTP 实现
- 有没有办法根据模板参数的类型在不同的类实现之间进行选择
- 在使用Bazel Build构建项目期间,处理/选择界面的不同实现
- C++选择排序的实现不正确.任何建议
- 在C 复杂性和实现中选择位向量
- Cocoa 选择器的行为可以在 C++ 中重新实现吗?
- 为什么选择我的自定义OP的CPU实现
- 我是否应该使用功能指针在构造函数中选择实现
- 如何利用遗传算法求C中数的平方根来实现选择和交叉
- C++ 如何实现带有数字和字母选择的菜单
- 我如何实现 N 选择 K,允许元素重复,并对具有重复元素的输出进行低优先级
- 如何选择基于C++版本的函数实现
- 在编译时选择实现
- 在c++中使用UDP进行简单的选择实现
- 在C++中使用#define宏可以从不同的命名空间中选择实现
- 如何使用 std::is_integral<> 选择实现?
- c++中的快速选择实现,无需额外的内存分配