Шаблон, позволяющий использовать 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(), ... );
}