带有变量和类型的C ++ 03宏定义?

时间:2014-01-15 00:02:59

标签: c++ templates macros c++03

我试图通过添加宏来简化库。我一直在阅读宏可以完成的所有不同的事情,但没有运气实现一些按我想要的方式工作的东西。

我写了一个与放置新功能一起使用的内存管理器。它会跟踪分配的内容以及预分配空间中的位置。

理想情况下,我想写一些类似的东西:

MyClass* c = New(mem) MyClass(3); // use memory manager instance 'mem' and constructor 'MyClass(int)'

并将其翻译为:

MyClass* c = new (mem.Reserve<MyClass>()) MyClass(3);

用于单个分配,并且:

MyClass* c = New(mem) MyClass[33]; //use memory manager instance 'mem' and default constructor to initialize and array of 33 MyClass objects

翻译为:

MyClass* c = new (mem.Reserve<MyClass>(33)) MyClass[33];

Reserve< TYPE >(SIZE)方法管理内部参数。它在由(sizeof(TYPE)*(SIZE))管理的预分配内存中保留mem个字节,并将起始地址的指针返回到放置新函数。

这是宏的可行操作吗?或者有更好的方法来解决这个问题吗?

我仅限于C ++ 03标准,因为这是我的ARM编译器所支持的。

我感谢任何建议和例子,以帮助我更好地理解这一点! 谢谢!

1 个答案:

答案 0 :(得分:1)

以下可能会有所帮助:

#define New(mem, Type) new (mem.Reserve<Type>()) Type
#define NewArray(mem, Type, Size) new (mem.Reserve<Type>(Size)) Type[Size]

使用它像:

MyClass* c = New(mem, MyClass)(3);       // new (mem.Reserve<MyClass>()) MyClass(3);
MyClass* c = NewArray(mem, MyClass, 33); // new (mem.Reserve<MyClass>(33)) MyClass[33];

也许定义void* operator new(size_t n, MemoryManager& mem);也可能有所帮助(如果Reserve<MyClass>仅使用MyClass知道其大小)。