std::experimental::ranges:: common_reference
|
Определено в заголовочном файле
<experimental/ranges/type_traits>
|
||
|
template
<
class
...
T
>
struct common_reference ; |
(ranges TS) | |
Определяет общий ссылочный тип для типов
T...
, то есть тип, к которому могут быть преобразованы или привязаны все типы в
T...
. Если такой тип существует (определяется согласно правилам ниже), член
type
именует этот тип. В противном случае член
type
отсутствует. Поведение не определено, если любой из типов в
T...
является неполным типом, за исключением (возможно, cv-квалифицированного)
void
.
При работе с ссылочными типами,
common_reference
пытается найти ссылочный тип, к которому можно привязать все предоставленные ссылочные типы, но может вернуть не ссылочный тип, если не сможет найти такой ссылочный тип.
-
Если
sizeof...
(
T
)
равен нулю, член
typeотсутствует. -
Если
sizeof...
(
T
)
равен единице (т.е.
T...содержит только один типT0), членtypeобозначает тот же тип, что и T0 . -
Если
sizeof...
(
T
)
равен двум (т.е.
T...содержит два типаT1иT2):-
Если
T1иT2являются ссылочными типами и существует простой общий ссылочный типSдляT1иT2(как определено ниже), то членtypeобозначаетS; -
Иначе, если существует
basic_common_reference
<
T1R, T2R, T1Q, T2Q
>
::
type
, где
TiRэто std:: remove_cv_t < std:: remove_reference_t < Ti >> , аTiQэто псевдоним шаблона, для которого TiQ < TiR > равен Ti , то членtypeобозначает этот тип; -
Иначе, если
decltype
(
false
?
val
<
T1
>
(
)
:
val
<
T2
>
(
)
)
, где
valэто шаблон функции template < class T > T val ( ) ; , обозначает допустимый тип, то членtypeобозначает этот тип; -
Иначе, если
ranges::
common_type_t
<
T1, T2
>
является допустимым типом, то член
typeобозначает этот тип; -
Иначе член
typeотсутствует.
-
Если
-
Если
sizeof...
(
T
)
больше двух (т.е.
T...состоит из типовT1, T2, R...), то если существует ranges :: common_reference_t < T1, T2 > , членtypeобозначает ranges :: common_reference_t < ranges :: common_reference_t < T1, T2 > , R... > , если такой тип существует. Во всех остальных случаях членtypeотсутствует.
Простой общий ссылочный тип
двух ссылочных типов
T1
и
T2
определяется следующим образом:
-
Если
T1являетсяcv1 X &иT2являетсяcv2 Y &(т.е. оба являются типами lvalue-ссылок): их простой общий ссылочный тип — decltype ( false ? std:: declval < cv12 X & > ( ) : std:: declval < cv12 Y & > ( ) ) , где cv12 — объединение cv1 и cv2 , если такой тип существует и является ссылочным типом. -
Если
T1иT2оба являются типами rvalue-ссылок: если существует простой общий ссылочный тип дляT1 &иT2 &(определенный согласно предыдущему пункту), то пустьCобозначает соответствующий тип rvalue-ссылки. Если std:: is_convertible < T1, C > :: value и std:: is_convertible < T2, C > :: value оба равныtrue, то простой общий ссылочный тип дляT1иT2—C. -
В противном случае один из двух типов должен быть типом lvalue-ссылки
A &, а другой — типом rvalue-ссылкиB &&(AиBмогут быть cv-квалифицированы). ПустьDобозначает простой общий ссылочный тип для A & и B const & , если он существует. Если D существует и std:: is_convertible < B && , D > :: value равенtrue, то простой общий ссылочный тип —D. - В противном случае простого общего ссылочного типа не существует.
Содержание |
Типы членов
| Название | Определение |
type
|
общий ссылочный тип для всех
T...
|
Вспомогательные типы
|
template
<
class
...
T
>
using common_reference_t = typename common_reference < T... > :: type ; |
||
|
template
<
class
T,
class
U,
template
<
class
>
class
TQual,
template
<
class
>
class
UQual
>
struct basic_common_reference { } ; |
||
Шаблон класса
basic_common_reference
является точкой настройки, которая позволяет пользователям влиять на результат
common_reference
для пользовательских типов (обычно прокси-ссылок). Первичный шаблон пуст.
Специализации
Программа может специализировать
basic_common_reference<T, U, TQual, UQual>
для первых двух параметров
T
и
U
если
std::
is_same
<
T,
std::
decay_t
<
T
>>
и
std::
is_same
<
U,
std::
decay_t
<
U
>>
оба истинны и хотя бы один из них зависит от определяемого программой типа.
Если такая специализация имеет член с именем
type
, он должен быть публичным и однозначным типом-членом, который обозначает тип, к которому можно преобразовать как
TQual
<
T
>
, так и
UQual
<
U
>
. Кроме того,
ranges
::
basic_common_reference
<
T, U, TQual, UQual
>
::
type
и
ranges
::
basic_common_reference
<
U, T, UQual, TQual
>
::
type
должны обозначать один и тот же тип.
Программа не может специализировать
basic_common_reference
на третьем или четвертом параметрах, а также не может специализировать
common_reference
самостоятельно. Программа, добавляющая специализации в нарушение этих правил, имеет неопределенное поведение.
Примечания
| Этот раздел не завершён |
Пример
|
Этот раздел не завершён
Причина: отсутствует пример |
Смотрите также
|
(C++11)
|
определяет общий тип группы типов
(шаблон класса) |
|
определяет общий тип набора типов
(шаблон класса) |
|
|
указывает, что два типа имеют общий ссылочный тип
(концепт) |