Spa*_*les 5 c++ containers atl variant
我有一些函数用于将2D变体SAFEARRAY转换为各种STL容器,有点像(仅限说明)
template<typename T>
std::set<T> SetFromSafeArray(VARIANT srcArray)
{
CComSafeArray<T> srcComArray(srcArray.parray);
std::set<T> destContainer;
for (ULONG i=0;i<srcComArray.GetCount();++i)
destContainer.insert(srcComArray.GetAt(i));
return destContainer;
}
Run Code Online (Sandbox Code Playgroud)
我觉得这不是一个非常简单的方法,它意味着我转换为每个STL容器都有一个单独的功能.
我的想法是为CComSafeArrays编写一个包装器和自定义迭代器,所以我可以做...
std::copy(srcComArray.begin(), srcComArray.end(), destContainer.begin());
Run Code Online (Sandbox Code Playgroud)
但是之前从未写过迭代器并且是新手我真的不知道它是否容易.
自定义CComSafeArray迭代器是我最好的,标准的c ++之类的选项(在这种情况下,我确信我可以找到一个关于编写迭代器的好教程)?还是有其他方法可以解决这个问题吗?
Boost不是一个选择.
TIA
我的想法是为CComSafeArrays编写一个包装器和自定义迭代器
这对于创建迭代器是个好主意,但是你不需要包装器CComSafeArray<T>,只需要迭代器.
所以我可以做...
std::copy(srcComArray.begin(), srcComArray.end(), destContainer.begin());
Run Code Online (Sandbox Code Playgroud)
但不是按照自己的方式,你可以这样做:
SomeContainer<T> destContainer(begin(srcComArray), end(srcComArray));
Run Code Online (Sandbox Code Playgroud)
因为几乎每个STL容器都有from range(迭代器对)的构造函数.
假设你已经写了迭代器CComSafeArray<T>- 函数begin/end将是这样的:
template <typename T>
CComSafeArrayIterator<T> begin(CComSafeArray<T>& container)
{
return CComSafeArrayIterator<T>(container, 0);
}
template <typename T>
CComSafeArrayIterator<T> end(CComSafeArray<T>& container)
{
return CComSafeArrayIterator<T>(container, container.getSize());
}
Run Code Online (Sandbox Code Playgroud)
请注意,begin()是零位置,end()是getSize()位置.
编写迭代器并不是火箭科学.只是一些功能.最重要的是知道你需要迭代什么.在您的情况下:容器引用(指针)和当前位置.迭代只是移动位置.通过容器和位置进行访问.比较是通过比较位置.
template <typename T>
class CComSafeArrayIterator {
public:
CComSafeArrayIterator(CComSafeArray<T>& container, ULONG position)
: container(&container),
position(position)
{}
// prefix ++it
CComSafeArrayIterator& operator ++() { ++position; return *this; }
// postfix it++
CComSafeArrayIterator operator ++(int) {
CComSafeArrayIterator prev = *this;
++position;
return prev;
}
// access by ->: it-> !! ony if getAt return reference not value
const T* operator -> () const {
return &(container->getAt(position));
}
// access by *: *it
const T& operator * () const {
return container->getAt(position);
}
// comparing
friend bool operator == (const CComSafeArrayIterator<T>& l,
const CComSafeArrayIterator<T>& r)
{
return l.position == r.position;
}
friend bool operator != (const CComSafeArrayIterator<T>& l,
const CComSafeArrayIterator<T>& r)
{
return l.position != r.position;
}
private:
// this is what you need
CComSafeArray<T>* container;
ULONG position;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
636 次 |
| 最近记录: |