Boost 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));
...
}
}

要求

MFC 區間

如果 <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 為以上所列的任一類型,ReFrange_reference<Range>::type 相同。 range_value<Range>::typeremove_reference<remove_const<Ref>::type>::type 相同, range_difference<Range>::typestd::ptrdiff_t 相同,而 range_pointer<Range>::typeadd_pointer<remove_reference<Ref>::type>::type 相同。對於 const Range,請見 const 區間

ATL 區間

如果 <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 為以上所列的任一類型,ReFrange_reference<Range>::type 相同。 range_value<Range>::typeremove_reference<remove_const<Ref>::type>::type 相同, range_difference<Range>::typestd::ptrdiff_t 相同,而 range_pointer<Range>::typeadd_pointer<remove_reference<Ref>::type>::type 相同。對於 const Range,請見 const 區間

const 區間

range_reference<const Range>::type 由以下算法定義。其中 Range 為以上所列的任一類型,ReFrange_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>::typerange_value<Range>::type 相同, range_difference<Range>::typestd::ptrdiff_t 相同,而 range_pointer<Range>::typeadd_pointer<remove_reference<range_reference<const Range>::type>::type>::type 相同。

參考