pointeeindirect_reference

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

pointee

雖然不可能拿出一個完全泛化的算法來直接確定 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

indirect_reference<T>::typepointee 更為專用,它用於前轉對其參數類型的一個對像進行提領所得的結果。多數可提領類型都只是返回它們的 pointee 的一個引用,但有些會返回代理的引用或以值方式返回 pointee. 當需要這些信息時,調用 indirect_reference.

這兩個模板對於 indirect_iterator 的正確使用都是必須的。

參考

pointee

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
}

indirect_reference

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