Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;03带有变量和类型的宏定义?_C++_Templates_Macros_C++03 - Fatal编程技术网

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

C++ C++;03带有变量和类型的宏定义?,c++,templates,macros,c++03,C++,Templates,Macros,C++03,我试图通过添加宏来简化库。我一直在阅读有关宏可以完成的所有不同的事情,但是没有实现我想要的工作方式 我编写了一个内存管理器,它将与placement新特性一起使用。它跟踪分配的内容以及它在预分配空间中的位置 理想情况下,我想写以下内容: MyClass* c = New(mem) MyClass(3); // use memory manager instance 'mem' and constructor 'MyClass(int)' 并将其翻译为: MyClass* c = new (me

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

我编写了一个内存管理器,它将与placement新特性一起使用。它跟踪分配的内容以及它在预分配空间中的位置

理想情况下,我想写以下内容:

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.Reserve<MyClass>(33)) MyClass[33];
翻译为:

MyClass* c = new (mem.Reserve<MyClass>()) MyClass(3);
MyClass* c = new (mem.Reserve<MyClass>(33)) MyClass[33];
MyClass*c=new(mem.Reserve(33))MyClass[33];
Reserve(SIZE)
方法是管理内部参数的方法。它在由
mem
管理的预分配内存中保留
(sizeof(TYPE)*(SIZE))
字节,并将起始地址指针返回到新函数

对于宏来说,这是可行的操作吗?还是有更好的方法来解决这个问题

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

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

以下内容可能会有所帮助:

#define New(mem, Type) new (mem.Reserve<Type>()) Type
#define NewArray(mem, Type, Size) new (mem.Reserve<Type>(Size)) Type[Size]
#定义新(mem,Type)新(mem.Reserve())类型
#定义新数组(mem,Type,Size)新(mem.Reserve(Size))类型[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];
MyClass*c=New(mem,MyClass)(3);//新的(mem.Reserve())MyClass(3);
MyClass*c=NewArray(mem,MyClass,33);//新(成员储备(33))MyClass[33];

可能定义新的
void*运算符(大小、内存管理器和内存)
可能也有帮助(如果
保留
使用
MyClass
只知道它的大小)。

我不这么认为。宏知道的一切都在
()
中,而
::运算符new
在任何情况下都不知道要传递的类型。因此,宏无法找到请求内存的对象的类型/范围。为什么不简单地使用该函数呢<代码>MyClass*c=mem.Reserve(33)我有一个运行placement New函数的函数“mem.New(SIZE)”。我的问题是,我只能硬编码默认构造函数。我需要能够调用任何构造函数,所以我的想法是消除新函数,让用户直接使用placement New。或者对使用参数的
New
进行更多重载?(您可能也需要可变参考版本,但这可能会很快变得笨拙,除非您有像boost这样的crafy技术)