代码之家  ›  专栏  ›  技术社区  ›  moonshadow

模板类型数组的alloca():如何做到这一点?

  •  1
  • moonshadow  · 技术社区  · 17 年前

    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
    };
    

    #define MakeSomeObject(_wrappedPtr, _runtimeCount) \
        SomeObject(alloca(sizeof(_wrappedPtr::Type)*_runtimeCount), \
                        _wrappedPtr, _runtimeCount)
    

    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 回复  |  直到 17 年前
        1
  •  1
  •   moonshadow    17 年前

    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 )