SAFEARRAY and STL algorithms
От: ssm Россия  
Дата: 23.04.03 13:43
Оценка: 65 (5)
Шаблон, позволяющий использовать SAFEARRAY с алгоритмами STL

template<typename T>
class safe_array_vector{    
    SAFEARRAY *pSA;
    T *data;
    size_t length(){return pSA->rgsabound->cElements;}
public:    

    typedef T*          iterator;
    typedef const T*    const_iterator;    
    typedef std::reverse_iterator<iterator, T, T&, ptrdiff_t>  
        reverse_iterator;
    typedef std::reverse_iterator<const_iterator, T, const T&, ptrdiff_t>  
        const_reverse_iterator;
    

    iterator begin(){return data;}
    const_iterator begin() const {return data;}    
    iterator end(){return data + length();}
    const_iterator end() const {return data + length();}

    reverse_iterator rbegin(){ return reverse_iterator(end());}
    const_reverse_iterator rbegin() const{ return const_reverse_iterator(end());}
    reverse_iterator rend(){ return reverse_iterator(begin());}
    const_reverse_iterator rend() const{ return const_reverse_iterator(begin());}

    explicit safe_array_vector(SAFEARRAY *pSA) : pSA(pSA){
        ATLASSERT(pSA);
        SafeArrayAccessData(pSA, (void**)&data);
    }
    ~safe_array_vector(){SafeArrayUnaccessData(pSA);}


    SAFEARRAY * operator->(){return pSA;}
    const SAFEARRAY * operator->() const{return pSA;}
};


Использование:

VARIANT variant_;
...
{
  safe_array_vector<BSTR> vec(variant_.parray);
  std::for_each(vec.begin(), vec.end(), ... );
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.