![]() |
![]() ![]() ![]() ![]() |
![]() |
OptionalPointee ConceptBoost , ,
|
||||||||||||||||||||||||||||||||||
| T | is a type that is a model of OptionalPointee |
| t | is an object of type T or possibly const T |
| Name | Expression | Return type | Semantics | |
|---|---|---|---|---|
| Value Access | *t | T& | If the pointee is valid returns a reference to
the pointee. If the pointee is invalid the result is undefined. |
|
| Value Access | t->xyz | T* | If the pointee is valid returns a builtin pointer to the pointee. If the pointee is invalid the result is undefined (It might not even return NULL). |
|
| Validity Test | bool(t) | bool | If the pointee is valid returns true. If the pointee is invalid returns false. |
|
| Invalidity Test | !t | bool | If the pointee is valid returns false. If the pointee is invalid returns true. |
Это понятие не определяет какой-либо конкретной семантики для реляционных операций, поэтому тип, который моделирует это понятие, может иметь либо мелкую, либо глубокую реляционную семантику.
Например, указатели, которые являются моделями OptionalPointee, имеют неглубокие реляционные операторы: сравнение указателей не включает сравнение указателей. Это имеет смысл для указателей, потому что они имеют неглубокую семантику копирования.
Но бустер::optional
Тем не менее, понятие itef может быть использовано для определенияглубинныхреляционных тестов, которые могут быть использованы в общем коде с любым типом моделей. OptionalPointee:
Отношение эквивалентности:
template<class OptionalPointee>
inline
bool equal_pointees ( OptionalPointee const& x, OptionalPointee const& y )
{
return (!x) != (!y) ? false : ( !x ? true : (*x) == (*y) ) ;
}
template<class OptionalPointee>
struct equal_pointees_t : std::binary_function<OptionalPointee,OptionalPointee,bool>
{
bool operator() ( OptionalPointee const& x, OptionalPointee const& y ) const
{ return equal_pointees(x,y) ; }
} ;
Предыдущая общая функция и объект функции имеют следующую семантику:
Если обаxиyимеют действительные указатели, он сравнивает значения через<(*x == *y)>.
Если только у одного есть действительный указатель, он возвращается<false>.
Если оба имеют недействительные указатели, возврат<true>.
Меньше, чем отношение:
template<class OptionalPointee>
inline
bool less_pointees ( OptionalPointee const& x, OptionalPointee const& y )
{
return !y ? false : ( !x ? true : (*x) < (*y) ) ;
}
template<class OptionalPointee>
struct less_pointees_t : std::binary_function<OptionalPointee,OptionalPointee,bool>
{
bool operator() ( OptionalPointee const& x, OptionalPointee const& y ) const
{ return less_pointees(x,y) ; }
} ;
Предшествующая общая функция и объект функции имеют следующую семантику:
Еслиуимеет недействительный указатель, возвращается<false>.
Другой, еслихимеет недействительный указатель, возвращается<true>.
xиyимеют действительные указатели, сравнивают значения через<(*x <
*y).>.
Все эти функции и объекты функций реализованы вcompare_pointees.hpp
Обратите внимание, что OptionalPointee не подразумевает псевдонима (и необязательно, например, не псевдоним); поэтому прямое использование реляционных операторов с подразумеваемым псевдонимом мелкой семантики - как с указателями - не должно использоваться с общим кодом, написанным для этой концепции.
На основе оригинальной концепции, разработанной Августом Сондерсом.
| Copyright © 2003 | Фернандо Каччиола |
Распространяется в соответствии с Лицензией на программное обеспечение Boost, версия 1.0. См.www.boost.org/LICENSE_1_0.txt
Статья OptionalPointee Concept раздела может быть полезна для разработчиков на c++ и boost.
:: Главная :: ::
реклама |