2014-01-15 44 views
0

我試圖通過添加一個宏來簡化一個庫。我一直在閱讀宏可以完成的所有不同的事情,但沒有運氣實現我想要的方式。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)方法是管理內部參數的方法。它在由mem管理的預分配內存中保留(sizeof(TYPE)*(SIZE))字節,並將起始地址的指針返回到放置新函數。

這是一個宏的可行操作?或者有更好的方法來解決這個問題嗎?

我只限於C++ 03標準,因爲這是我的ARM編譯器支持的。

我很欣賞任何建議和例子,以幫助我更好地理解這一點! 謝謝!

+1

我不這麼認爲。宏知道的所有內容都在'()'內,':: new操作符在任何情況下都不知道傳入的類型。 Ergo,宏無法找到請求內存的東西的類型/範圍。 –

+0

爲什麼不簡單使用該功能? 'MyClass * c = mem.Reserve (33);' –

+0

我有一個運行放置新功能的函數'mem.New (SIZE)'。我的問題是,我只能硬編碼默認的構造函數。我需要能夠調用任何構造函數,所以我的想法是消除New函數,並讓用戶直接使用放置位置。 – radensb

回答

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只知道它的大小)。