| Author: | David Abrahams, Jeremy Siek, Thomas Witt |
|---|---|
| Contact: | dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com |
| Organization: | Boost Consulting, Indiana University Open Systems Lab, Zephyr Associates, Inc. |
| Date: | 2006-09-11 |
| Copyright: | Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004. |
| 概要: | iterator_archetype 類構造了一個迭代器訪問概念和一個迭代器遍歷概念的最小實現。它用於在編譯期檢查某個模板的類型要求是否足以覆蓋該模板的實現。進一步的信息請看 boost::concept_check 庫的文檔。 |
|---|
目錄
namespace iterator_archetypes
{
// 訪問分類
typedef /*實現定義*/ readable_iterator_t;
typedef /*實現定義*/ writable_iterator_t;
typedef /*實現定義*/ readable_writable_iterator_t;
typedef /*實現定義*/ readable_lvalue_iterator_t;
typedef /*實現定義*/ writable_lvalue_iterator_t;
}
template <
class Value
, class AccessCategory
, class TraversalCategory
>
class iterator_archetype
{
typedef /* 見下文 */ value_type;
typedef /* 見下文 */ reference;
typedef /* 見下文 */ pointer;
typedef /* 見下文 */ difference_type;
typedef /* 見下文 */ iterator_category;
};
提供了對應於以下標準迭代器訪問概念的各種組合的訪問類別類型:
readable_iterator_t :=
Readable Iterator
writable_iterator_t :=
Writeable Iterator
readable_writable_iterator_t :=
Readable Iterator & Writeable Iterator & Swappable Iterator
readable_lvalue_iterator_t :=
Readable Iterator & Lvalue Iterator
writeable_lvalue_iterator_t :=
Readable Iterator & Writeable Iterator & Swappable Iterator & Lvalue Iterator
AccessCategory 參數必須是一個預定義的訪問類別標誌。TraversalCategory 必須是一個標準遍歷標誌。Value 類型必須滿足由 AccessCategory 和 TraversalCategory 所指定的迭代器概念的要求,正如嵌套 traits 類型所暗示的那樣。
iterator_archetype 符合由 AccessCategory 和 TraversalCategory 參數指定的迭代器概念。iterator_archetype 不符合其它訪問概念或其它更進一步的遍歷概念。
嵌套的 trait 類型定義如下:
if (AccessCategory == readable_iterator_t)
value_type = Value
reference = Value
pointer = Value*
else if (AccessCategory == writable_iterator_t)
value_type = void
reference = void
pointer = void
else if (AccessCategory == readable_writable_iterator_t)
value_type = Value
reference :=
一個可轉換為 Value 的類型 X,可使以下表達式有效。給定一個類型 X 的
對像 x 和一個類型 Value 的對象 v.
x = v
pointer = Value*
else if (AccessCategory == readable_lvalue_iterator_t)
value_type = Value
reference = Value const&
pointer = Value const*
else if (AccessCategory == writable_lvalue_iterator_t)
value_type = Value
reference = Value&
pointer = Value*
if ( TraversalCategory 可轉換為 forward_traversal_tag )
difference_type := ptrdiff_t
else
difference_type := unspecified type
iterator_category :=
一個滿足以下兩個約束條件的類型 X:
1. X 可轉換為 X1, 且不能轉換為進一步派生的類型,其中 X1 的定義為:
if (reference 是一個引用類型
&& TraversalCategory 可轉換為 forward_traversal_tag)
{
if (TraversalCategory 可轉換為 random_access_traversal_tag)
X1 = random_access_iterator_tag
else if (TraversalCategory 可轉換為 bidirectional_traversal_tag)
X1 = bidirectional_iterator_tag
else
X1 = forward_iterator_tag
}
else
{
if (TraversalCategory 可轉換為 single_pass_traversal_tag
&& reference != void)
X1 = input_iterator_tag
else
X1 = output_iterator_tag
}
2. X 可轉換為 TraversalCategory