Range 的 MFC/ATL 擴展| Author: | Shunsuke Sogame |
|---|---|
| Contact: | mb2act@yahoo.co.jp |
| Date: | 26th of May 2006 |
| Copyright: | Shunsuke Sogame 2005-2006. Use, modification and distribution is subject to the Boost Software License, Version 1.0 (see LICENSE_1_0.txt). |
Boost.Range 的 MFC/ATL 擴展提供了對 MFC/ATL 集合和字符串類型的 Boost.Range 支持。
CTypedPtrArray<CPtrArray, CList<CString> *> myArray;
...
BOOST_FOREACH (CList<CString> *theList, myArray)
{
BOOST_FOREACH (CString& str, *theList)
{
boost::to_upper(str);
std::sort(boost::begin(str), boost::end(str));
...
}
}
如果 <boost/range/mfc.hpp> 在 Boost.Range 頭文件之前或之後被包含,則 MFC 的集合和字符串類型就成為了 Range 的 Model. 下表列出了 MFC 區間的遍歷類別和 range_reference .
| 區間 | 遍歷類別 | range_reference<Range>::type |
|---|---|---|
| CArray<T,A> | 隨機訪問 | T& |
| CList<T,A> | 雙向 | T& |
| CMap<K,AK,M,AM> | 前向 | Range::CPair& |
| CTypedPtrArray<B,T*> | 隨機訪問 | T* const |
| CTypedPtrList<B,T*> | 雙向 | T* const |
| CTypedPtrMap<B,T*,V*> | 前向 | std::pair<T*,V*> const |
| CByteArray | 隨機訪問 | BYTE& |
| CDWordArray | 隨機訪問 | DWORD& |
| CObArray | 隨機訪問 | CObject* & |
| CPtrArray | 隨機訪問 | void* & |
| CStringArray | 隨機訪問 | CString& |
| CUIntArray | 隨機訪問 | UINT& |
| CWordArray | 隨機訪問 | WORD& |
| CObList | 雙向 | CObject* & |
| CPtrList | 雙向 | void* & |
| CStringList | 雙向 | CString& |
| CMapPtrToWord | 前向 | std::pair<void*,WORD> const |
| CMapPtrToPtr | 前向 | std::pair<void*,void*> const |
| CMapStringToOb | 前向 | std::pair<String,CObject*> const |
| CMapStringToString | 前向 | Range::CPair& |
| CMapWordToOb | 前向 | std::pair<WORD,CObject*> const |
| CMapWordToPtr | 前向 | std::pair<WORD,void*> const |
其它 Boost.Range 元函數定義如下。其中 Range 為以上所列的任一類型,ReF 與 range_reference<Range>::type 相同。 range_value<Range>::type 與 remove_reference<remove_const<Ref>::type>::type 相同, range_difference<Range>::type 與 std::ptrdiff_t 相同,而 range_pointer<Range>::type 與 add_pointer<remove_reference<Ref>::type>::type 相同。對於 const Range,請見 const 區間。
如果 <boost/range/atl.hpp> 在 Boost.Range 頭文件之前或之後被包含,則 ATL 集合和字符串類型就成為了 Range 的 model. 下表列出了 ATL 區間的遍歷類別和 range_reference .The table below lists the Traversal Category and range_reference of ATL ranges.
| 區間 | 遍歷類別 | range_reference<Range>::type |
|---|---|---|
| CAtlArray<E,ET> | 隨機訪問 | E& |
| CAutoPtrArray<E> | 隨機訪問 | E& |
| CInterfaceArray<I,pi> | 隨機訪問 | CComQIPtr<I,pi>& |
| CAtlList<E,ET> | 雙向 | E& |
| CAutoPtrList<E> | 雙向 | E& |
| CHeapPtrList<E,A> | 雙向 | E& |
| CInterfaceList<I,pi> | 雙向 | CComQIPtr<I,pi>& |
| CAtlMap<K,V,KT,VT> | 前向 | Range::CPair& |
| CRBTree<K,V,KT,VT> | 雙向 | Range::CPair& |
| CRBMap<K,V,KT,VT> | 雙向 | Range::CPair& |
| CRBMultiMap<K,V,KT,VT> | 雙向 | Range::CPair& |
| CSimpleStringT<B,b> | 隨機訪問 | B& |
| CStringT<B,ST> | 隨機訪問 | B& |
| CFixedStringT<S,n> | 隨機訪問 | range_reference<S>::type |
| CStringT<B,ST> | 隨機訪問 | B& |
| CComBSTR | 隨機訪問 | OLECHAR& |
| CSimpleArray<T,TE> | 隨機訪問 | T& |
其它 Boost.Range 元函數定義如下。其中 Range 為以上所列的任一類型,ReF 與 range_reference<Range>::type 相同。 range_value<Range>::type 與 remove_reference<remove_const<Ref>::type>::type 相同, range_difference<Range>::type 與 std::ptrdiff_t 相同,而 range_pointer<Range>::type 與 add_pointer<remove_reference<Ref>::type>::type 相同。對於 const Range,請見 const 區間。
range_reference<const Range>::type 由以下算法定義。其中 Range 為以上所列的任一類型,ReF 與 range_reference<Range>::type 相同。
if (Range is CObArray || Range is CObList)
return CObject const * &
else if (Range is CPtrArray || Range is CPtrList)
return void const * &
else if (there is a type X such that X& is the same as ReF)
return X const &
else if (there is a type X such that X* const is the same as ReF)
return X const * const
else
return ReF
其它 Boost.Range 元函數定義如下。range_value<Range>::type 與 range_value<Range>::type 相同, range_difference<Range>::type 與 std::ptrdiff_t 相同,而 range_pointer<Range>::type 與 add_pointer<remove_reference<range_reference<const Range>::type>::type>::type 相同。