Boost C++ 库

……世界上最受推崇且设计最专业的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu,《C++ 编码规范

pointee 和 indirect_reference - Boost C++ 函数库

pointeeandindirect_reference

作者 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

事实证明,要设计一种完全通用的算法来直接确定 此处为何物 是不可能的,但可以要求pointee<Dereferenceable>::type是正确的。自然地,pointee具有同样的困难:它无法为所有::type可靠地确定合适的可解引,但它能做出非常好的猜测(适用于所有指针、标准库和 Boost 智能指针以及迭代器),当猜测错误时,可以根据需要进行特化。

namespace boost
{
  template <class T>
  struct pointee<third_party_lib::smart_pointer<T> >
  {
      typedef T type;
  };
}

indirect_reference

indirect_reference<T>::typepointee更为专用,旨在用于转发对其参数类型对象进行解引用的结果。大多数可解引用类型只是返回对其所指对象的引用,但有些会返回代理引用或按值返回所指对象。当需要这些信息时,请调用indirect_reference.

这两个模板对于 indirect_iterator 的正确运行至关重要。

参考

pointee

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
}

indirect_reference

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