| Author: | David Abrahams |
|---|---|
| Contact: | dave@boost-consulting.com |
| Organization: | Boost Consulting |
| Date: | 2006-09-11 |
| Copyright: | Copyright David Abrahams 2004. |
| 概要: | 提供在泛型代碼中推斷指針、智能指針和迭代器的引用類型的能力。 |
|---|
你曾經想過寫一個可以操作任意可提領對象的泛型函數嗎?如果有,你可能會遇到這個問題,即如何確定該對像"所指"的對象的類型:
template <class Dereferenceable>
void f(Dereferenceable p)
{
what-goes-here? value = *p;
...
}
雖然不可能拿出一個完全泛化的算法來直接確定 what-goes-here, 但是有可能要求 pointee<Dereferenceable>::type 是正確的。當然,pointee 也有同樣的困難:它不能對所有 Dereferenceables 可靠地確定適當的 ::type, 不過它可以猜得很準(它可以用於所有指針、標準的和 boost 的智能指針及迭代器),而且如果它猜錯的話,也可以按需要進行特化:
namespace boost
{
template <class T>
struct pointee<third_party_lib::smart_pointer<T> >
{
typedef T type;
};
}
indirect_reference<T>::type 比 pointee 更為專用,它用於前轉對其參數類型的一個對像進行提領所得的結果。多數可提領類型都只是返回它們的 pointee 的一個引用,但有些會返回代理的引用或以值方式返回 pointee. 當需要這些信息時,調用 indirect_reference.
這兩個模板對於 indirect_iterator 的正確使用都是必須的。
template <class Dereferenceable>
struct pointee
{
typedef /* 見下文 */ type;
};
| 要求: | 對於類型 Dereferenceable 的一個對像 x, *x 是合法的。如果 ++x 是非法的,那麼它應該既不是歧義的,也不違犯訪問控制,且 Dereferenceable::element_type 應該是一個可訪問的類型。否則 iterator_traits<Dereferenceable>::value_type 就應該是合法的。[註:這些要求無需適用於 pointee 的顯式特化或偏特化] |
|---|
type 按以下算法確定,其中 x 為類型 Dereferenceable 的一個對像:
if ( ++x 是非法的 )
{
return ``Dereferenceable::element_type``
}
else if (``*x`` 是一個 std::iterator_traits<Dereferenceable>::value_type 的非常量引用)
{
return iterator_traits<Dereferenceable>::value_type
}
else
{
return iterator_traits<Dereferenceable>::value_type const
}
template <class Dereferenceable>
struct indirect_reference
{
typedef /* 見下文 */ type;
};
| 要求: | 對於類型 Dereferenceable 的一個對像 x, *x 是合法的。如果 ++x 是非法的,那麼它應該既不是歧義的,也不違犯訪問控制,且 pointee<Dereferenceable>::type& 應該是合法的。否則 iterator_traits<Dereferenceable>::reference 就應該是合法的。[註:這些要求無需適用於indirect_reference 的顯式特化或偏特化] |
|---|
type 按以下算法確定,其中 x 為類型 Dereferenceable 的一個對像:
if ( ++x 是非法的 )
return ``pointee<Dereferenceable>::type&``
else
std::iterator_traits<Dereferenceable>::reference