首先,我不是真的有问题,但我喜欢尽可能简单.我正在使用一个名为templated的类Math
,除了很多其他东西之外还有随机函数.
不同类型的随机函数,以及设置随机种子的函数.因此除种子函数之外的每个函数都使用该类型class Real
.但是当我想设置种子时,我必须传递一些随机(haha)类型才能调用该函数:
Math<u32>::SeedRandom(System::time());
Run Code Online (Sandbox Code Playgroud)
同样这不是一个真正的问题,但我很好奇是否有可能在不需要使用的情况下获得相同的结果<u32>
.
这是Math类的一个片段:
template <class Real>
class Math
{
public:
static void SeedRandom(u32 seed) { srand(seed); }
static Real UnitRandom() { return (Real)((f64)rand() / (f64)RAND_MAX); }
};
Run Code Online (Sandbox Code Playgroud)
顺便说一句.f64
被typedef定义来double
和u32
到unsigned int
.
我们为游戏开发的多平台引擎使用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
Run Code Online (Sandbox Code Playgroud)
并且GIN_USE_EASTL在Windows上定义为0.该发动机被称为Ginkgo,这就是GIN的来源.
我们正在使用列表,向量......这样的
ginstl::list myList;
ginstl::vector myVector;
Run Code Online (Sandbox Code Playgroud)
哪个工作得很好.但是当我们使用字符串或队列时,由于我上面解释的原因,我们必须写
eastl::string myString;
std::queue myQueue;
Run Code Online (Sandbox Code Playgroud)
这就是我在这里发帖的原因,因为这不是最佳的!我想要做的是将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
Run Code Online (Sandbox Code Playgroud)
但不幸的是,这是不行的,因为#sfine宏中不允许使用::.有没有办法实现相同的东西(能够指定我想用于特定数据结构的实现)以某种方式不同?我可以去
#define ginstl_list eastl::list
Run Code Online (Sandbox Code Playgroud)
但我更喜欢上面的结构!是否有办法(除了编写自定义预处理器)解决问题?