私はスマート ポインター型を持っており、その型のポインターと (実行時に動的に計算される) カウントを受け取り、スマート ポインターが指すオブジェクトの多くのインスタンスを保持するのに十分なメモリをスタックから割り当てるオブジェクトを構築したいと考えています。 . これを達成するための正しい構文が見つからないようです。出来ますか?
このようなものを考えると
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 );
}
実際のコードでは、使用時に非常に長くて読みにくいステートメントになるため、型を引数としてマクロに渡すことは避けたいと思います。可能。