1
我有一個智能指針類型,並且想要構造一個對象,該對象需要一個該類型的指針和一個計數(在運行時動態計算),並從堆棧中分配足夠的內存來保存該對象的許多實例。指着。我似乎無法找到合適的語法來實現這一目標;可能嗎?alloca()模板類型的數組:如何做到這一點?
鑑於這樣的事情
template<typename T>
class PointerWrapper
{
public:
PointerWrapper(T const * _pointer): m_pointer(_pointer) {}
typedef T Type;
T const * m_pointer;
};
template<typename T>
class SomeObject: public NoCopyOrAssign
{
public:
SomeObject(void * _allocaBuffer, PointerWrapper<T> _source, int _count);
};
我想要做這樣的事情:
void Test(PointerWrapper<int> _array, int _count)
{
SomeObject<int> object = MakeSomeObject(_array, _count);
// do some work with object
};
代碼調用下面的宏不能編譯,因爲編譯器不能從_wrappedPtr推斷SomeObject的模板參數所以抱怨模板參數丟失:
#define MakeSomeObject(_wrappedPtr, _runtimeCount) \
SomeObject(alloca(sizeof(_wrappedPtr::Type)*_runtimeCount), \
_wrappedPtr, _runtimeCount)
如果使用模板化指針封裝類型的函數,雖然編譯器可以隱式推導類型,但調用它的代碼不會編譯,因爲SomeObject有意定義但不實現複製構造函數或賦值運算符;即使它編譯它不會做正確的事,因爲ALLOCA()提供的內存會馬上走出去的範圍:
template<typename WrappedT>
SomeObject<typename WrappedT::Type> MakeSomeObject
(WrappedT _pointer, uint _runtimeCount)
{
return SomeObject<typename WrappedT::Type>
(alloca(sizeof(typename WrappedT::Type)*_runtimeCount),
_pointer, _runtimeCount);
}
我想,以避免傳遞類型分爲宏觀以來參數在真實的代碼中,這會導致在使用時相當冗長,難以閱讀的語句,但是如果沒有更好的可能,我想這是一個後備。