2009-06-22 52 views
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); 
} 

我想,以避免傳遞類型分爲宏觀以來參數在真實的代碼中,這會導致在使用時相當冗長,難以閱讀的語句,但是如果沒有更好的可能,我想這是一個後備。

回答

1

沒關係,解決了它;訣竅是將兩種方法結合起來:

template<typename WrappedT> 
SomeObject<typename WrappedT::Type> _MakeSomeObject 
    (void *_buffer, WrappedT _pointer, int _runtimeCount) 
{ 
    return SomeObject<typename WrappedT::Type> 
     (_buffer, _pointer, _runtimeCount); 
} 

template<typename WrappedT> 
int SizeT(WrappedT const _dummy) { return sizeof(typename WrappedT::Type); } 

#define MakeSomeObject(_wrappedPtr, _runtimeCount) \ 
     _MakeSomeObject(alloca(SizeT(_wrappedPtr)*_runtimeCount), \ 
      _wrappedPtr, _runtimeCount)