| 作者 | David Abrahams |
|---|---|
| 联系方式 | dave@boost-consulting.com |
| 组织 | Boost Consulting |
| 日期 | 2006-09-11 |
| 版权 | Copyright David Abrahams 2004。 |
| 摘要 | 提供在泛型代码中推导指针、智能指针和迭代器所指向类型的能力。 |
|---|
您是否曾想编写一个可以操作任何可解引用对象的泛型函数?如果您曾有过这样的想法,那么您很可能遇到了如何确定对象“指向”的类型的问题。
template <class Dereferenceable>
void f(Dereferenceable p)
{
what-goes-here? value = *p;
...
}
事实证明,要设计一种完全通用的算法来直接确定 此处为何物 是不可能的,但可以要求pointee<Dereferenceable>::type是正确的。自然地,pointee具有同样的困难:它无法为所有::type可靠地确定合适的可解引,但它能做出非常好的猜测(适用于所有指针、标准库和 Boost 智能指针以及迭代器),当猜测错误时,可以根据需要进行特化。
namespace boost
{
template <class T>
struct pointee<third_party_lib::smart_pointer<T> >
{
typedef T type;
};
}
indirect_reference<T>::type比pointee更为专用,旨在用于转发对其参数类型对象进行解引用的结果。大多数可解引用类型只是返回对其所指对象的引用,但有些会返回代理引用或按值返回所指对象。当需要这些信息时,请调用indirect_reference.
这两个模板对于 indirect_iterator 的正确运行至关重要。
template <class Dereferenceable>
struct pointee
{
typedef /* see below */ type;
};
| 要求 | 对于一个对象x类型为可解引, *x是良构的(well-formed)。如果++x是病构的(ill-formed),它既不应该是模棱两可的,也不应该违反访问控制,并且Dereferenceable::element_type应该是一个可访问的类型。否则iterator_traits<Dereferenceable>::value_type应该是良构的。[注意:这些要求不必适用于的显式或部分特化。pointee] |
|---|
type根据以下算法确定,其中x是一个对象,类型为可解引:
if ( ++x is ill-formed )
{
return ``Dereferenceable::element_type``
}
else if (``*x`` is a mutable reference to
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 /* see below */ type;
};
| 要求 | 对于一个对象x类型为可解引, *x是良构的(well-formed)。如果++x是病构的(ill-formed),它既不应该是模棱两可的,也不应该违反访问控制,并且pointee<Dereferenceable>::type&应该是良构的。否则iterator_traits<Dereferenceable>::reference应该是良构的。[注意:这些要求不必适用于的显式或部分特化。indirect_reference] |
|---|
type根据以下算法确定,其中x是一个对象,类型为可解引:
if ( ++x is ill-formed )
return ``pointee<Dereferenceable>::type&``
else
std::iterator_traits<Dereferenceable>::reference