2019-02-22 19:19:36 +02:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< meta charset = "UTF-8" >
2019-05-11 21:06:44 +03:00
< meta http-equiv = "X-UA-Compatible" content = "IE=edge" >
2019-02-22 19:19:36 +02:00
< meta name = "viewport" content = "width=device-width, initial-scale=1.0" >
2019-05-11 21:06:44 +03:00
< meta name = "generator" content = "Asciidoctor 2.0.9" >
2019-02-22 19:19:36 +02:00
< meta name = "author" content = "Peter Dimov" >
< title > Boost.Variant2: A never valueless variant type</ title >
< link rel = "stylesheet" href = "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700" >
< style >
2019-05-11 21:06:44 +03:00
/* Asciidoctor default stylesheet | MIT License | https://asciidoctor.org */
/* Uncomment @import statement to use as custom stylesheet */
2019-02-22 19:19:36 +02:00
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
2019-05-11 21:06:44 +03:00
article , aside , details , figcaption , figure , footer , header , hgroup , main , nav , section { display : block }
audio , video { display : inline-block }
2019-02-22 19:19:36 +02:00
audio : not ([ controls ]) { display : none ; height : 0 }
html { font-family : sans-serif ; -ms- text-size-adjust : 100 % ; -webkit- text-size-adjust : 100 % }
2019-05-11 21:06:44 +03:00
a { background : none }
2019-02-22 19:19:36 +02:00
a : focus { outline : thin dotted }
a : active , a : hover { outline : 0 }
h1 { font-size : 2 em ; margin : .67 em 0 }
abbr [ title ] { border-bottom : 1 px dotted }
b , strong { font-weight : bold }
dfn { font-style : italic }
hr { -moz- box-sizing : content-box ; box-sizing : content-box ; height : 0 }
mark { background : #ff0 ; color : #000 }
code , kbd , pre , samp { font-family : monospace ; font-size : 1 em }
pre { white-space : pre-wrap }
q { quotes : "\201C" "\201D" "\2018" "\2019" }
small { font-size : 80 % }
sub , sup { font-size : 75 % ; line-height : 0 ; position : relative ; vertical-align : baseline }
sup { top : -.5 em }
sub { bottom : -.25 em }
img { border : 0 }
svg : not ( : root ) { overflow : hidden }
figure { margin : 0 }
fieldset { border : 1 px solid silver ; margin : 0 2 px ; padding : .35 em .625 em .75 em }
legend { border : 0 ; padding : 0 }
button , input , select , textarea { font-family : inherit ; font-size : 100 % ; margin : 0 }
button , input { line-height : normal }
button , select { text-transform : none }
button , html input [ type = "button" ], input [ type = "reset" ], input [ type = "submit" ] { -webkit- appearance : button ; cursor : pointer }
button [ disabled ], html input [ disabled ] { cursor : default }
input [ type = "checkbox" ], input [ type = "radio" ] { box-sizing : border-box ; padding : 0 }
button :: -moz-focus-inner , input :: -moz-focus-inner { border : 0 ; padding : 0 }
textarea { overflow : auto ; vertical-align : top }
table { border-collapse : collapse ; border-spacing : 0 }
*,* :: before ,* :: after { -moz- box-sizing : border-box ; -webkit- box-sizing : border-box ; box-sizing : border-box }
html , body { font-size : 100 % }
body { background : #fff ; color : rgba ( 0 , 0 , 0 , .8 ); padding : 0 ; margin : 0 ; font-family : "Noto Serif" , "DejaVu Serif" , serif ; font-weight : 400 ; font-style : normal ; line-height : 1 ; position : relative ; cursor : auto ; tab-size : 4 ; -moz- osx-font-smoothing : grayscale ; -webkit- font-smoothing : antialiased }
a : hover { cursor : pointer }
img , object , embed { max-width : 100 % ; height : auto }
object , embed { height : 100 % }
img { -ms- interpolation-mode : bicubic }
. left { float : left !important }
. right { float : right !important }
. text-left { text-align : left !important }
. text-right { text-align : right !important }
. text-center { text-align : center !important }
. text-justify { text-align : justify !important }
. hide { display : none }
img , object , svg { display : inline-block ; vertical-align : middle }
textarea { height : auto ; min-height : 50 px }
select { width : 100 % }
. center { margin-left : auto ; margin-right : auto }
. stretch { width : 100 % }
. subheader , . admonitionblock td . content > . title , . audioblock > . title , . exampleblock > . title , . imageblock > . title , . listingblock > . title , . literalblock > . title , . stemblock > . title , . openblock > . title , . paragraph > . title , . quoteblock > . title , table . tableblock > . title , . verseblock > . title , . videoblock > . title , . dlist > . title , . olist > . title , . ulist > . title , . qlist > . title , . hdlist > . title { line-height : 1.45 ; color : #7a2518 ; font-weight : 400 ; margin-top : 0 ; margin-bottom : .25 em }
div , dl , dt , dd , ul , ol , li , h1 , h2 , h3 , # toctitle , . sidebarblock > . content > . title , h4 , h5 , h6 , pre , form , p , blockquote , th , td { margin : 0 ; padding : 0 ; direction : ltr }
a { color : #2156a5 ; text-decoration : underline ; line-height : inherit }
a : hover , a : focus { color : #1d4b8f }
2019-05-11 21:06:44 +03:00
a img { border : 0 }
2019-02-22 19:19:36 +02:00
p { font-family : inherit ; font-weight : 400 ; font-size : 1 em ; line-height : 1.6 ; margin-bottom : 1.25 em ; text-rendering : optimizeLegibility }
p aside { font-size : .875 em ; line-height : 1.35 ; font-style : italic }
h1 , h2 , h3 , # toctitle , . sidebarblock > . content > . title , h4 , h5 , h6 { font-family : "Open Sans" , "DejaVu Sans" , sans-serif ; font-weight : 300 ; font-style : normal ; color : #ba3925 ; text-rendering : optimizeLegibility ; margin-top : 1 em ; margin-bottom : .5 em ; line-height : 1.0125 em }
h1 small , h2 small , h3 small , # toctitle small , . sidebarblock > . content > . title small , h4 small , h5 small , h6 small { font-size : 60 % ; color : #e99b8f ; line-height : 0 }
h1 { font-size : 2.125 em }
h2 { font-size : 1.6875 em }
h3 , # toctitle , . sidebarblock > . content > . title { font-size : 1.375 em }
h4 , h5 { font-size : 1.125 em }
h6 { font-size : 1 em }
2019-05-11 21:06:44 +03:00
hr { border : solid #dddddf ; border-width : 1 px 0 0 ; clear : both ; margin : 1.25 em 0 1.1875 em ; height : 0 }
2019-02-22 19:19:36 +02:00
em , i { font-style : italic ; line-height : inherit }
strong , b { font-weight : bold ; line-height : inherit }
small { font-size : 60 % ; line-height : inherit }
code { font-family : "Droid Sans Mono" , "DejaVu Sans Mono" , monospace ; font-weight : 400 ; color : rgba ( 0 , 0 , 0 , .9 )}
ul , ol , dl { font-size : 1 em ; line-height : 1.6 ; margin-bottom : 1.25 em ; list-style-position : outside ; font-family : inherit }
ul , ol { margin-left : 1.5 em }
ul li ul , ul li ol { margin-left : 1.25 em ; margin-bottom : 0 ; font-size : 1 em }
ul . square li ul , ul . circle li ul , ul . disc li ul { list-style : inherit }
ul . square { list-style-type : square }
ul . circle { list-style-type : circle }
ul . disc { list-style-type : disc }
ol li ul , ol li ol { margin-left : 1.25 em ; margin-bottom : 0 }
dl dt { margin-bottom : .3125 em ; font-weight : bold }
dl dd { margin-bottom : 1.25 em }
abbr , acronym { text-transform : uppercase ; font-size : 90 % ; color : rgba ( 0 , 0 , 0 , .8 ); border-bottom : 1 px dotted #ddd ; cursor : help }
abbr { text-transform : none }
blockquote { margin : 0 0 1.25 em ; padding : .5625 em 1.25 em 0 1.1875 em ; border-left : 1 px solid #ddd }
blockquote cite { display : block ; font-size : .9375 em ; color : rgba ( 0 , 0 , 0 , .6 )}
blockquote cite :: before { content : "\2014 \0020" }
blockquote cite a , blockquote cite a : visited { color : rgba ( 0 , 0 , 0 , .6 )}
blockquote , blockquote p { line-height : 1.6 ; color : rgba ( 0 , 0 , 0 , .85 )}
@ media screen and ( min-width : 768px ) { h1 , h2 , h3 , # toctitle , . sidebarblock > . content > . title , h4 , h5 , h6 { line-height : 1.2 }
h1 { font-size : 2.75 em }
h2 { font-size : 2.3125 em }
h3 , # toctitle , . sidebarblock > . content > . title { font-size : 1.6875 em }
h4 { font-size : 1.4375 em }}
table { background : #fff ; margin-bottom : 1.25 em ; border : solid 1 px #dedede }
table thead , table tfoot { background : #f7f8f7 }
table thead tr th , table thead tr td , table tfoot tr th , table tfoot tr td { padding : .5 em .625 em .625 em ; font-size : inherit ; color : rgba ( 0 , 0 , 0 , .8 ); text-align : left }
table tr th , table tr td { padding : .5625 em .625 em ; font-size : inherit ; color : rgba ( 0 , 0 , 0 , .8 )}
2019-05-11 21:06:44 +03:00
table tr . even , table tr . alt { background : #f8f8f7 }
2019-02-22 19:19:36 +02:00
table thead tr th , table tfoot tr th , table tbody tr td , table tr td , table tfoot tr td { display : table-cell ; line-height : 1.6 }
h1 , h2 , h3 , # toctitle , . sidebarblock > . content > . title , h4 , h5 , h6 { line-height : 1.2 ; word-spacing : -.05 em }
h1 strong , h2 strong , h3 strong , # toctitle strong , . sidebarblock > . content > . title strong , h4 strong , h5 strong , h6 strong { font-weight : 400 }
. clearfix :: before , . clearfix :: after , . float-group :: before , . float-group :: after { content : " " ; display : table }
. clearfix :: after , . float-group :: after { clear : both }
2019-05-11 21:06:44 +03:00
: not ( pre ) : not ([ class ^= L ])> code { font-size : .9375 em ; font-style : normal !important ; letter-spacing : 0 ; padding : .1 em .5 ex ; word-spacing : -.15 em ; background : #f7f7f8 ; -webkit- border-radius : 4 px ; border-radius : 4 px ; line-height : 1.45 ; text-rendering : optimizeSpeed ; word-wrap : break-word }
: not ( pre )> code . nobreak { word-wrap : normal }
: not ( pre )> code . nowrap { white-space : nowrap }
pre { color : rgba ( 0 , 0 , 0 , .9 ); font-family : "Droid Sans Mono" , "DejaVu Sans Mono" , monospace ; line-height : 1.45 ; text-rendering : optimizeSpeed }
pre code , pre pre { color : inherit ; font-size : inherit ; line-height : inherit }
pre > code { display : block }
pre . nowrap , pre . nowrap pre { white-space : pre ; word-wrap : normal }
2019-02-22 19:19:36 +02:00
em em { font-style : normal }
strong strong { font-weight : 400 }
. keyseq { color : rgba ( 51 , 51 , 51 , .8 )}
2019-05-11 21:06:44 +03:00
kbd { font-family : "Droid Sans Mono" , "DejaVu Sans Mono" , monospace ; display : inline-block ; color : rgba ( 0 , 0 , 0 , .8 ); font-size : .65 em ; line-height : 1.45 ; background : #f7f7f7 ; border : 1 px solid #ccc ; -webkit- border-radius : 3 px ; border-radius : 3 px ; -webkit- box-shadow : 0 1 px 0 rgba ( 0 , 0 , 0 , .2 ), 0 0 0 .1 em white inset ; box-shadow : 0 1 px 0 rgba ( 0 , 0 , 0 , .2 ), 0 0 0 .1 em #fff inset ; margin : 0 .15 em ; padding : .2 em .5 em ; vertical-align : middle ; position : relative ; top : -.1 em ; white-space : nowrap }
2019-02-22 19:19:36 +02:00
. keyseq kbd : first-child { margin-left : 0 }
. keyseq kbd : last-child { margin-right : 0 }
. menuseq , . menuref { color : #000 }
. menuseq b : not ( . caret ), . menuref { font-weight : inherit }
. menuseq { word-spacing : -.02 em }
. menuseq b . caret { font-size : 1.25 em ; line-height : .8 }
. menuseq i . caret { font-weight : bold ; text-align : center ; width : .45 em }
b . button :: before , b . button :: after { position : relative ; top : -1 px ; font-weight : 400 }
b . button :: before { content : "[" ; padding : 0 3 px 0 2 px }
b . button :: after { content : "]" ; padding : 0 2 px 0 3 px }
p a > code : hover { color : rgba ( 0 , 0 , 0 , .9 )}
# header , # content , # footnotes , # footer { width : 100 % ; margin-left : auto ; margin-right : auto ; margin-top : 0 ; margin-bottom : 0 ; max-width : 62.5 em ; * zoom : 1 ; position : relative ; padding-left : .9375 em ; padding-right : .9375 em }
# header :: before , # header :: after , # content :: before , # content :: after , # footnotes :: before , # footnotes :: after , # footer :: before , # footer :: after { content : " " ; display : table }
# header :: after , # content :: after , # footnotes :: after , # footer :: after { clear : both }
# content { margin-top : 1.25 em }
# content :: before { content : none }
# header > h1 : first-child { color : rgba ( 0 , 0 , 0 , .85 ); margin-top : 2.25 rem ; margin-bottom : 0 }
2019-05-11 21:06:44 +03:00
# header > h1 : first-child + # toc { margin-top : 8 px ; border-top : 1 px solid #dddddf }
# header > h1 : only-child , body . toc2 # header > h1 : nth-last-child ( 2 ) { border-bottom : 1 px solid #dddddf ; padding-bottom : 8 px }
# header . details { border-bottom : 1 px solid #dddddf ; line-height : 1.45 ; padding-top : .25 em ; padding-bottom : .25 em ; padding-left : .25 em ; color : rgba ( 0 , 0 , 0 , .6 ); display : -ms- flexbox ; display : -webkit- flex ; display : flex ; -ms- flex-flow : row wrap ; -webkit- flex-flow : row wrap ; flex-flow : row wrap }
2019-02-22 19:19:36 +02:00
# header . details span : first-child { margin-left : -.125 em }
# header . details span . email a { color : rgba ( 0 , 0 , 0 , .85 )}
# header . details br { display : none }
# header . details br + span :: before { content : "\00a0\2013\00a0" }
# header . details br + span . author :: before { content : "\00a0\22c5\00a0" ; color : rgba ( 0 , 0 , 0 , .85 )}
# header . details br + span # revremark :: before { content : "\00a0|\00a0" }
# header # revnumber { text-transform : capitalize }
# header # revnumber :: after { content : "\00a0" }
2019-05-11 21:06:44 +03:00
# content > h1 : first-child : not ([ class ]) { color : rgba ( 0 , 0 , 0 , .85 ); border-bottom : 1 px solid #dddddf ; padding-bottom : 8 px ; margin-top : 0 ; padding-top : 1 rem ; margin-bottom : 1.25 rem }
# toc { border-bottom : 1 px solid #e7e7e9 ; padding-bottom : .5 em }
2019-02-22 19:19:36 +02:00
# toc > ul { margin-left : .125 em }
# toc ul . sectlevel0 > li > a { font-style : italic }
# toc ul . sectlevel0 ul . sectlevel1 { margin : .5 em 0 }
# toc ul { font-family : "Open Sans" , "DejaVu Sans" , sans-serif ; list-style-type : none }
# toc li { line-height : 1.3334 ; margin-top : .3334 em }
# toc a { text-decoration : none }
# toc a : active { text-decoration : underline }
# toctitle { color : #7a2518 ; font-size : 1.2 em }
@ media screen and ( min-width : 768px ) {# toctitle { font-size : 1.375 em }
body . toc2 { padding-left : 15 em ; padding-right : 0 }
2019-05-11 21:06:44 +03:00
# toc . toc2 { margin-top : 0 !important ; background : #f8f8f7 ; position : fixed ; width : 15 em ; left : 0 ; top : 0 ; border-right : 1 px solid #e7e7e9 ; border-top-width : 0 !important ; border-bottom-width : 0 !important ; z-index : 1000 ; padding : 1.25 em 1 em ; height : 100 % ; overflow : auto }
2019-02-22 19:19:36 +02:00
# toc . toc2 # toctitle { margin-top : 0 ; margin-bottom : .8 rem ; font-size : 1.2 em }
# toc . toc2 > ul { font-size : .9 em ; margin-bottom : 0 }
# toc . toc2 ul ul { margin-left : 0 ; padding-left : 1 em }
# toc . toc2 ul . sectlevel0 ul . sectlevel1 { padding-left : 0 ; margin-top : .5 em ; margin-bottom : .5 em }
body . toc2 . toc-right { padding-left : 0 ; padding-right : 15 em }
2019-05-11 21:06:44 +03:00
body . toc2 . toc-right # toc . toc2 { border-right-width : 0 ; border-left : 1 px solid #e7e7e9 ; left : auto ; right : 0 }}
2019-02-22 19:19:36 +02:00
@ media screen and ( min-width : 1280px ) { body . toc2 { padding-left : 20 em ; padding-right : 0 }
# toc . toc2 { width : 20 em }
# toc . toc2 # toctitle { font-size : 1.375 em }
# toc . toc2 > ul { font-size : .95 em }
# toc . toc2 ul ul { padding-left : 1.25 em }
body . toc2 . toc-right { padding-left : 0 ; padding-right : 20 em }}
# content # toc { border-style : solid ; border-width : 1 px ; border-color : #e0e0dc ; margin-bottom : 1.25 em ; padding : 1.25 em ; background : #f8f8f7 ; -webkit- border-radius : 4 px ; border-radius : 4 px }
# content # toc > : first-child { margin-top : 0 }
# content # toc > : last-child { margin-bottom : 0 }
2019-05-11 21:06:44 +03:00
# footer { max-width : 100 % ; background : rgba ( 0 , 0 , 0 , .8 ); padding : 1.25 em }
2019-02-22 19:19:36 +02:00
# footer-text { color : rgba ( 255 , 255 , 255 , .8 ); line-height : 1.44 }
# content { margin-bottom : .625 em }
. sect1 { padding-bottom : .625 em }
@ media screen and ( min-width : 768px ) {# content { margin-bottom : 1.25 em }
. sect1 { padding-bottom : 1.25 em }}
. sect1 : last-child { padding-bottom : 0 }
2019-05-11 21:06:44 +03:00
. sect1 + . sect1 { border-top : 1 px solid #e7e7e9 }
2019-02-22 19:19:36 +02:00
# content h1 > a . anchor , h2 > a . anchor , h3 > a . anchor , # toctitle > a . anchor , . sidebarblock > . content > . title > a . anchor , h4 > a . anchor , h5 > a . anchor , h6 > a . anchor { position : absolute ; z-index : 1001 ; width : 1.5 ex ; margin-left : -1.5 ex ; display : block ; text-decoration : none !important ; visibility : hidden ; text-align : center ; font-weight : 400 }
# content h1 > a . anchor :: before , h2 > a . anchor :: before , h3 > a . anchor :: before , # toctitle > a . anchor :: before , . sidebarblock > . content > . title > a . anchor :: before , h4 > a . anchor :: before , h5 > a . anchor :: before , h6 > a . anchor :: before { content : "\00A7" ; font-size : .85 em ; display : block ; padding-top : .1 em }
# content h1 : hover > a . anchor , # content h1 > a . anchor : hover , h2 : hover > a . anchor , h2 > a . anchor : hover , h3 : hover > a . anchor , # toctitle : hover > a . anchor , . sidebarblock > . content > . title : hover > a . anchor , h3 > a . anchor : hover , # toctitle > a . anchor : hover , . sidebarblock > . content > . title > a . anchor : hover , h4 : hover > a . anchor , h4 > a . anchor : hover , h5 : hover > a . anchor , h5 > a . anchor : hover , h6 : hover > a . anchor , h6 > a . anchor : hover { visibility : visible }
# content h1 > a . link , h2 > a . link , h3 > a . link , # toctitle > a . link , . sidebarblock > . content > . title > a . link , h4 > a . link , h5 > a . link , h6 > a . link { color : #ba3925 ; text-decoration : none }
# content h1 > a . link : hover , h2 > a . link : hover , h3 > a . link : hover , # toctitle > a . link : hover , . sidebarblock > . content > . title > a . link : hover , h4 > a . link : hover , h5 > a . link : hover , h6 > a . link : hover { color : #a53221 }
2019-05-11 21:06:44 +03:00
details , . audioblock , . imageblock , . literalblock , . listingblock , . stemblock , . videoblock { margin-bottom : 1.25 em }
details > summary : first-of-type { cursor : pointer ; display : list-item ; outline : none ; margin-bottom : .75 em }
2019-02-22 19:19:36 +02:00
. admonitionblock td . content > . title , . audioblock > . title , . exampleblock > . title , . imageblock > . title , . listingblock > . title , . literalblock > . title , . stemblock > . title , . openblock > . title , . paragraph > . title , . quoteblock > . title , table . tableblock > . title , . verseblock > . title , . videoblock > . title , . dlist > . title , . olist > . title , . ulist > . title , . qlist > . title , . hdlist > . title { text-rendering : optimizeLegibility ; text-align : left ; font-family : "Noto Serif" , "DejaVu Serif" , serif ; font-size : 1 rem ; font-style : italic }
table . tableblock . fit-content > caption . title { white-space : nowrap ; width : 0 }
. paragraph . lead > p , # preamble > . sectionbody >[ class = "paragraph" ] : first-of-type p { font-size : 1.21875 em ; line-height : 1.6 ; color : rgba ( 0 , 0 , 0 , .85 )}
2019-05-11 21:06:44 +03:00
table . tableblock # preamble > . sectionbody >[ class = "paragraph" ] : first-of-type p { font-size : inherit }
2019-02-22 19:19:36 +02:00
. admonitionblock > table { border-collapse : separate ; border : 0 ; background : none ; width : 100 % }
. admonitionblock > table td . icon { text-align : center ; width : 80 px }
. admonitionblock > table td . icon img { max-width : none }
. admonitionblock > table td . icon . title { font-weight : bold ; font-family : "Open Sans" , "DejaVu Sans" , sans-serif ; text-transform : uppercase }
2019-05-11 21:06:44 +03:00
. admonitionblock > table td . content { padding-left : 1.125 em ; padding-right : 1.25 em ; border-left : 1 px solid #dddddf ; color : rgba ( 0 , 0 , 0 , .6 )}
2019-02-22 19:19:36 +02:00
. admonitionblock > table td . content > : last-child > : last-child { margin-bottom : 0 }
. exampleblock > . content { border-style : solid ; border-width : 1 px ; border-color : #e6e6e6 ; margin-bottom : 1.25 em ; padding : 1.25 em ; background : #fff ; -webkit- border-radius : 4 px ; border-radius : 4 px }
. exampleblock > . content > : first-child { margin-top : 0 }
. exampleblock > . content > : last-child { margin-bottom : 0 }
2019-05-11 21:06:44 +03:00
. sidebarblock { border-style : solid ; border-width : 1 px ; border-color : #dbdbd6 ; margin-bottom : 1.25 em ; padding : 1.25 em ; background : #f3f3f2 ; -webkit- border-radius : 4 px ; border-radius : 4 px }
2019-02-22 19:19:36 +02:00
. sidebarblock > : first-child { margin-top : 0 }
. sidebarblock > : last-child { margin-bottom : 0 }
. sidebarblock > . content > . title { color : #7a2518 ; margin-top : 0 ; text-align : center }
. exampleblock > . content > : last-child > : last-child , . exampleblock > . content . olist > ol > li : last-child > : last-child , . exampleblock > . content . ulist > ul > li : last-child > : last-child , . exampleblock > . content . qlist > ol > li : last-child > : last-child , . sidebarblock > . content > : last-child > : last-child , . sidebarblock > . content . olist > ol > li : last-child > : last-child , . sidebarblock > . content . ulist > ul > li : last-child > : last-child , . sidebarblock > . content . qlist > ol > li : last-child > : last-child { margin-bottom : 0 }
2019-05-11 21:06:44 +03:00
. literalblock pre , . listingblock > . content > pre { -webkit- border-radius : 4 px ; border-radius : 4 px ; word-wrap : break-word ; overflow-x : auto ; padding : 1 em ; font-size : .8125 em }
@ media screen and ( min-width : 768px ) {. literalblock pre , . listingblock > . content > pre { font-size : .90625 em }}
@ media screen and ( min-width : 1280px ) {. literalblock pre , . listingblock > . content > pre { font-size : 1 em }}
. literalblock pre , . listingblock > . content > pre : not ( . highlight ), . listingblock > . content > pre [ class = "highlight" ], . listingblock > . content > pre [ class ^= "highlight " ] { background : #f7f7f8 }
. literalblock . output pre { color : #f7f7f8 ; background : rgba ( 0 , 0 , 0 , .9 )}
. listingblock > . content { position : relative }
. listingblock code [ data-lang ] :: before { display : none ; content : attr ( data - lang ); position : absolute ; font-size : .75 em ; top : .425 rem ; right : .5 rem ; line-height : 1 ; text-transform : uppercase ; color : inherit ; opacity : .5 }
. listingblock : hover code [ data-lang ] :: before { display : block }
. listingblock . terminal pre . command :: before { content : attr ( data - prompt ); padding-right : .5 em ; color : inherit ; opacity : .5 }
. listingblock . terminal pre . command : not ([ data-prompt ]) :: before { content : "$" }
2019-02-22 19:19:36 +02:00
. listingblock pre . highlightjs { padding : 0 }
. listingblock pre . highlightjs > code { padding : 1 em ; -webkit- border-radius : 4 px ; border-radius : 4 px }
. listingblock pre . prettyprint { border-width : 0 }
2019-05-11 21:06:44 +03:00
. prettyprint { background : #f7f7f8 }
pre . prettyprint . linenums { line-height : 1.45 ; margin-left : 2 em }
pre . prettyprint li { background : none ; list-style-type : inherit ; padding-left : 0 }
pre . prettyprint li code [ data-lang ] :: before { opacity : 1 }
pre . prettyprint li : not ( : first-child ) code [ data-lang ] :: before { display : none }
table . linenotable { border-collapse : separate ; border : 0 ; margin-bottom : 0 ; background : none }
table . linenotable td [ class ] { color : inherit ; vertical-align : top ; padding : 0 ; line-height : inherit ; white-space : normal }
table . linenotable td . code { padding-left : .75 em }
table . linenotable td . linenos { border-right : 1 px solid currentColor ; opacity : .35 ; padding-right : .5 em }
pre . pygments . lineno { border-right : 1 px solid currentColor ; opacity : .35 ; display : inline-block ; margin-right : .75 em }
pre . pygments . lineno :: before { content : "" ; margin-right : -.125 em }
2019-02-22 19:19:36 +02:00
. quoteblock { margin : 0 1 em 1.25 em 1.5 em ; display : table }
. quoteblock > . title { margin-left : -1.5 em ; margin-bottom : .75 em }
2019-05-11 21:06:44 +03:00
. quoteblock blockquote , . quoteblock p { color : rgba ( 0 , 0 , 0 , .85 ); font-size : 1.15 rem ; line-height : 1.75 ; word-spacing : .1 em ; letter-spacing : 0 ; font-style : italic ; text-align : justify }
2019-02-22 19:19:36 +02:00
. quoteblock blockquote { margin : 0 ; padding : 0 ; border : 0 }
. quoteblock blockquote :: before { content : "\201c" ; float : left ; font-size : 2.75 em ; font-weight : bold ; line-height : .6 em ; margin-left : -.6 em ; color : #7a2518 ; text-shadow : 0 1 px 2 px rgba ( 0 , 0 , 0 , .1 )}
. quoteblock blockquote > . paragraph : last-child p { margin-bottom : 0 }
2019-05-11 21:06:44 +03:00
. quoteblock . attribution { margin-top : .75 em ; margin-right : .5 ex ; text-align : right }
2019-02-22 19:19:36 +02:00
. verseblock { margin : 0 1 em 1.25 em }
. verseblock pre { font-family : "Open Sans" , "DejaVu Sans" , sans ; font-size : 1.15 rem ; color : rgba ( 0 , 0 , 0 , .85 ); font-weight : 300 ; text-rendering : optimizeLegibility }
. verseblock pre strong { font-weight : 400 }
. verseblock . attribution { margin-top : 1.25 rem ; margin-left : .5 ex }
. quoteblock . attribution , . verseblock . attribution { font-size : .9375 em ; line-height : 1.45 ; font-style : italic }
. quoteblock . attribution br , . verseblock . attribution br { display : none }
. quoteblock . attribution cite , . verseblock . attribution cite { display : block ; letter-spacing : -.025 em ; color : rgba ( 0 , 0 , 0 , .6 )}
2019-05-11 21:06:44 +03:00
. quoteblock . abstract blockquote :: before , . quoteblock . excerpt blockquote :: before , . quoteblock . quoteblock blockquote :: before { display : none }
. quoteblock . abstract blockquote , . quoteblock . abstract p , . quoteblock . excerpt blockquote , . quoteblock . excerpt p , . quoteblock . quoteblock blockquote , . quoteblock . quoteblock p { line-height : 1.6 ; word-spacing : 0 }
2019-02-22 19:19:36 +02:00
. quoteblock . abstract { margin : 0 1 em 1.25 em ; display : block }
. quoteblock . abstract > . title { margin : 0 0 .375 em ; font-size : 1.15 em ; text-align : center }
2019-05-11 21:06:44 +03:00
. quoteblock . excerpt , . quoteblock . quoteblock { margin : 0 0 1.25 em ; padding : 0 0 .25 em 1 em ; border-left : .25 em solid #dddddf }
. quoteblock . excerpt blockquote , . quoteblock . excerpt p , . quoteblock . quoteblock blockquote , . quoteblock . quoteblock p { color : inherit ; font-size : 1.0625 rem }
. quoteblock . excerpt . attribution , . quoteblock . quoteblock . attribution { color : inherit ; text-align : left ; margin-right : 0 }
2019-02-22 19:19:36 +02:00
table . tableblock { max-width : 100 % ; border-collapse : separate }
p . tableblock : last-child { margin-bottom : 0 }
2019-05-11 21:06:44 +03:00
td . tableblock > . content > : last-child { margin-bottom : -1.25 em }
td . tableblock > . content > : last-child . sidebarblock { margin-bottom : 0 }
2019-02-22 19:19:36 +02:00
table . tableblock , th . tableblock , td . tableblock { border : 0 solid #dedede }
table . grid-all > thead > tr > . tableblock , table . grid-all > tbody > tr > . tableblock { border-width : 0 1 px 1 px 0 }
table . grid-all > tfoot > tr > . tableblock { border-width : 1 px 1 px 0 0 }
table . grid-cols >*> tr > . tableblock { border-width : 0 1 px 0 0 }
table . grid-rows > thead > tr > . tableblock , table . grid-rows > tbody > tr > . tableblock { border-width : 0 0 1 px }
table . grid-rows > tfoot > tr > . tableblock { border-width : 1 px 0 0 }
table . grid-all >*> tr > . tableblock : last-child , table . grid-cols >*> tr > . tableblock : last-child { border-right-width : 0 }
table . grid-all > tbody > tr : last-child > . tableblock , table . grid-all > thead : last-child > tr > . tableblock , table . grid-rows > tbody > tr : last-child > . tableblock , table . grid-rows > thead : last-child > tr > . tableblock { border-bottom-width : 0 }
table . frame-all { border-width : 1 px }
table . frame-sides { border-width : 0 1 px }
table . frame-topbot , table . frame-ends { border-width : 1 px 0 }
2019-05-11 21:06:44 +03:00
table . stripes-all tr , table . stripes-odd tr : nth-of-type ( odd ), table . stripes-even tr : nth-of-type ( even ), table . stripes-hover tr : hover { background : #f8f8f7 }
2019-02-22 19:19:36 +02:00
th . halign-left , td . halign-left { text-align : left }
th . halign-right , td . halign-right { text-align : right }
th . halign-center , td . halign-center { text-align : center }
th . valign-top , td . valign-top { vertical-align : top }
th . valign-bottom , td . valign-bottom { vertical-align : bottom }
th . valign-middle , td . valign-middle { vertical-align : middle }
table thead th , table tfoot th { font-weight : bold }
tbody tr th { display : table-cell ; line-height : 1.6 ; background : #f7f8f7 }
tbody tr th , tbody tr th p , tfoot tr th , tfoot tr th p { color : rgba ( 0 , 0 , 0 , .8 ); font-weight : bold }
p . tableblock > code : only-child { background : none ; padding : 0 }
p . tableblock { font-size : 1 em }
ol { margin-left : 1.75 em }
ul li ol { margin-left : 1.5 em }
dl dd { margin-left : 1.125 em }
dl dd : last-child , dl dd : last-child > : last-child { margin-bottom : 0 }
ol > li p , ul > li p , ul dd , ol dd , . olist . olist , . ulist . ulist , . ulist . olist , . olist . ulist { margin-bottom : .625 em }
ul . checklist , ul . none , ol . none , ul . no-bullet , ol . no-bullet , ol . unnumbered , ul . unstyled , ol . unstyled { list-style-type : none }
ul . no-bullet , ol . no-bullet , ol . unnumbered { margin-left : .625 em }
ul . unstyled , ol . unstyled { margin-left : 0 }
ul . checklist { margin-left : .625 em }
ul . checklist li > p : first-child > . fa-square-o : first-child , ul . checklist li > p : first-child > . fa-check-square-o : first-child { width : 1.25 em ; font-size : .8 em ; position : relative ; bottom : .125 em }
ul . checklist li > p : first-child > input [ type = "checkbox" ] : first-child { margin-right : .25 em }
ul . inline { display : -ms- flexbox ; display : -webkit- box ; display : flex ; -ms- flex-flow : row wrap ; -webkit- flex-flow : row wrap ; flex-flow : row wrap ; list-style : none ; margin : 0 0 .625 em -1.25 em }
ul . inline > li { margin-left : 1.25 em }
. unstyled dl dt { font-weight : 400 ; font-style : normal }
ol . arabic { list-style-type : decimal }
ol . decimal { list-style-type : decimal-leading-zero }
ol . loweralpha { list-style-type : lower-alpha }
ol . upperalpha { list-style-type : upper-alpha }
ol . lowerroman { list-style-type : lower-roman }
ol . upperroman { list-style-type : upper-roman }
ol . lowergreek { list-style-type : lower-greek }
. hdlist > table , . colist > table { border : 0 ; background : none }
. hdlist > table > tbody > tr , . colist > table > tbody > tr { background : none }
td . hdlist1 , td . hdlist2 { vertical-align : top ; padding : 0 .625 em }
td . hdlist1 { font-weight : bold ; padding-bottom : 1.25 em }
. literalblock + . colist , . listingblock + . colist { margin-top : -.5 em }
. colist td : not ([ class ]) : first-child { padding : .4 em .75 em 0 ; line-height : 1 ; vertical-align : top }
. colist td : not ([ class ]) : first-child img { max-width : none }
. colist td : not ([ class ]) : last-child { padding : .25 em 0 }
. thumb , . th { line-height : 0 ; display : inline-block ; border : solid 4 px #fff ; -webkit- box-shadow : 0 0 0 1 px #ddd ; box-shadow : 0 0 0 1 px #ddd }
2019-05-11 21:06:44 +03:00
. imageblock . left { margin : .25 em .625 em 1.25 em 0 }
. imageblock . right { margin : .25 em 0 1.25 em .625 em }
2019-02-22 19:19:36 +02:00
. imageblock > . title { margin-bottom : 0 }
. imageblock . thumb , . imageblock . th { border-width : 6 px }
. imageblock . thumb > . title , . imageblock . th > . title { padding : 0 .125 em }
. image . left , . image . right { margin-top : .25 em ; margin-bottom : .25 em ; display : inline-block ; line-height : 0 }
. image . left { margin-right : .625 em }
. image . right { margin-left : .625 em }
a . image { text-decoration : none ; display : inline-block }
a . image object { pointer-events : none }
sup . footnote , sup . footnoteref { font-size : .875 em ; position : static ; vertical-align : super }
sup . footnote a , sup . footnoteref a { text-decoration : none }
sup . footnote a : active , sup . footnoteref a : active { text-decoration : underline }
# footnotes { padding-top : .75 em ; padding-bottom : .75 em ; margin-bottom : .625 em }
# footnotes hr { width : 20 % ; min-width : 6.25 em ; margin : -.25 em 0 .75 em ; border-width : 1 px 0 0 }
# footnotes . footnote { padding : 0 .375 em 0 .225 em ; line-height : 1.3334 ; font-size : .875 em ; margin-left : 1.2 em ; margin-bottom : .2 em }
# footnotes . footnote a : first-of-type { font-weight : bold ; text-decoration : none ; margin-left : -1.05 em }
# footnotes . footnote : last-of-type { margin-bottom : 0 }
# content # footnotes { margin-top : -.625 em ; margin-bottom : 0 ; padding : .75 em 0 }
. gist . file-data > table { border : 0 ; background : #fff ; width : 100 % ; margin-bottom : 0 }
. gist . file-data > table td . line-data { width : 99 % }
div . unbreakable { page-break-inside : avoid }
. big { font-size : larger }
. small { font-size : smaller }
. underline { text-decoration : underline }
. overline { text-decoration : overline }
. line-through { text-decoration : line-through }
. aqua { color : #00bfbf }
2019-05-11 21:06:44 +03:00
. aqua-background { background : #00fafa }
2019-02-22 19:19:36 +02:00
. black { color : #000 }
2019-05-11 21:06:44 +03:00
. black-background { background : #000 }
2019-02-22 19:19:36 +02:00
. blue { color : #0000bf }
2019-05-11 21:06:44 +03:00
. blue-background { background : #0000fa }
2019-02-22 19:19:36 +02:00
. fuchsia { color : #bf00bf }
2019-05-11 21:06:44 +03:00
. fuchsia-background { background : #fa00fa }
2019-02-22 19:19:36 +02:00
. gray { color : #606060 }
2019-05-11 21:06:44 +03:00
. gray-background { background : #7d7d7d }
2019-02-22 19:19:36 +02:00
. green { color : #006000 }
2019-05-11 21:06:44 +03:00
. green-background { background : #007d00 }
2019-02-22 19:19:36 +02:00
. lime { color : #00bf00 }
2019-05-11 21:06:44 +03:00
. lime-background { background : #00fa00 }
2019-02-22 19:19:36 +02:00
. maroon { color : #600000 }
2019-05-11 21:06:44 +03:00
. maroon-background { background : #7d0000 }
2019-02-22 19:19:36 +02:00
. navy { color : #000060 }
2019-05-11 21:06:44 +03:00
. navy-background { background : #00007d }
2019-02-22 19:19:36 +02:00
. olive { color : #606000 }
2019-05-11 21:06:44 +03:00
. olive-background { background : #7d7d00 }
2019-02-22 19:19:36 +02:00
. purple { color : #600060 }
2019-05-11 21:06:44 +03:00
. purple-background { background : #7d007d }
2019-02-22 19:19:36 +02:00
. red { color : #bf0000 }
2019-05-11 21:06:44 +03:00
. red-background { background : #fa0000 }
2019-02-22 19:19:36 +02:00
. silver { color : #909090 }
2019-05-11 21:06:44 +03:00
. silver-background { background : #bcbcbc }
2019-02-22 19:19:36 +02:00
. teal { color : #006060 }
2019-05-11 21:06:44 +03:00
. teal-background { background : #007d7d }
2019-02-22 19:19:36 +02:00
. white { color : #bfbfbf }
2019-05-11 21:06:44 +03:00
. white-background { background : #fafafa }
2019-02-22 19:19:36 +02:00
. yellow { color : #bfbf00 }
2019-05-11 21:06:44 +03:00
. yellow-background { background : #fafa00 }
2019-02-22 19:19:36 +02:00
span . icon > . fa { cursor : default }
a span . icon > . fa { cursor : inherit }
. admonitionblock td . icon [ class ^= "fa icon-" ] { font-size : 2.5 em ; text-shadow : 1 px 1 px 2 px rgba ( 0 , 0 , 0 , .5 ); cursor : default }
. admonitionblock td . icon . icon-note :: before { content : "\f05a" ; color : #19407c }
. admonitionblock td . icon . icon-tip :: before { content : "\f0eb" ; text-shadow : 1 px 1 px 2 px rgba ( 155 , 155 , 0 , .8 ); color : #111 }
. admonitionblock td . icon . icon-warning :: before { content : "\f071" ; color : #bf6900 }
. admonitionblock td . icon . icon-caution :: before { content : "\f06d" ; color : #bf3400 }
. admonitionblock td . icon . icon-important :: before { content : "\f06a" ; color : #bf0000 }
2019-05-11 21:06:44 +03:00
. conum [ data-value ] { display : inline-block ; color : #fff !important ; background : rgba ( 0 , 0 , 0 , .8 ); -webkit- border-radius : 100 px ; border-radius : 100 px ; text-align : center ; font-size : .75 em ; width : 1.67 em ; height : 1.67 em ; line-height : 1.67 em ; font-family : "Open Sans" , "DejaVu Sans" , sans-serif ; font-style : normal ; font-weight : bold }
2019-02-22 19:19:36 +02:00
. conum [ data-value ] * { color : #fff !important }
. conum [ data-value ]+ b { display : none }
. conum [ data-value ] :: after { content : attr ( data - value )}
pre . conum [ data-value ] { position : relative ; top : -.125 em }
b . conum * { color : inherit !important }
. conum : not ([ data-value ]) : empty { display : none }
dt , th . tableblock , td . content , div . footnote { text-rendering : optimizeLegibility }
h1 , h2 , p , td . content , span . alt { letter-spacing : -.01 em }
p strong , td . content strong , div . footnote strong { letter-spacing : -.005 em }
p , blockquote , dt , td . content , span . alt { font-size : 1.0625 rem }
p { margin-bottom : 1.25 rem }
. sidebarblock p , . sidebarblock dt , . sidebarblock td . content , p . tableblock { font-size : 1 em }
2019-05-11 21:06:44 +03:00
. exampleblock > . content { background : #fffef7 ; border-color : #e0e0dc ; -webkit- box-shadow : 0 1 px 4 px #e0e0dc ; box-shadow : 0 1 px 4 px #e0e0dc }
2019-02-22 19:19:36 +02:00
. print-only { display : none !important }
@ page { margin : 1 . 25cm . 75cm }
@ media print { * { -webkit- box-shadow : none !important ; box-shadow : none !important ; text-shadow : none !important }
html { font-size : 80 % }
a { color : inherit !important ; text-decoration : underline !important }
a . bare , a [ href ^= "#" ], a [ href ^= "mailto:" ] { text-decoration : none !important }
a [ href ^= "http:" ] : not ( . bare ) :: after , a [ href ^= "https:" ] : not ( . bare ) :: after { content : "(" attr ( href ) ")" ; display : inline-block ; font-size : .875 em ; padding-left : .25 em }
abbr [ title ] :: after { content : " (" attr ( title ) ")" }
pre , blockquote , tr , img , object , svg { page-break-inside : avoid }
thead { display : table-header-group }
svg { max-width : 100 % }
p , blockquote , dt , td . content { font-size : 1 em ; orphans : 3 ; widows : 3 }
h2 , h3 , # toctitle , . sidebarblock > . content > . title { page-break-after : avoid }
# toc , . sidebarblock , . exampleblock > . content { background : none !important }
2019-05-11 21:06:44 +03:00
# toc { border-bottom : 1 px solid #dddddf !important ; padding-bottom : 0 !important }
2019-02-22 19:19:36 +02:00
body . book # header { text-align : center }
body . book # header > h1 : first-child { border : 0 !important ; margin : 2.5 em 0 1 em }
body . book # header . details { border : 0 !important ; display : block ; padding : 0 !important }
body . book # header . details span : first-child { margin-left : 0 !important }
body . book # header . details br { display : block }
body . book # header . details br + span :: before { content : none !important }
body . book # toc { border : 0 !important ; text-align : left !important ; padding : 0 !important ; margin : 0 !important }
body . book # toc , body . book # preamble , body . book h1 . sect0 , body . book . sect1 > h2 { page-break-before : always }
. listingblock code [ data-lang ] :: before { display : block }
# footer { padding : 0 .9375 em }
. hide-on-print { display : none !important }
. print-only { display : block !important }
. hide-for-print { display : none !important }
. show-for-print { display : inherit !important }}
@ media print , amzn-kf8 {# header > h1 : first-child { margin-top : 1.25 rem }
. sect1 { padding : 0 !important }
. sect1 + . sect1 { border : 0 }
# footer { background : none }
# footer-text { color : rgba ( 0 , 0 , 0 , .6 ); font-size : .9 em }}
@ media amzn-kf8 {# header , # content , # footnotes , # footer { padding : 0 }}
</ style >
</ head >
< body class = "article toc2 toc-left" >
< div id = "header" >
< h1 > Boost.Variant2: A never valueless variant type</ h1 >
< div class = "details" >
< span id = "author" class = "author" > Peter Dimov</ span >< br >
</ div >
< div id = "toc" class = "toc2" >
< div id = "toctitle" > Table of Contents</ div >
< ul class = "sectlevel1" >
2019-05-12 00:13:38 +03:00
< li >< a href = "#overview" > Overview</ a >
< ul class = "sectlevel2" >
< li >< a href = "#overview_description" > Description</ a ></ li >
< li >< a href = "#overview_usage_examples" > Usage Examples</ a ></ li >
< li >< a href = "#overview_construction_and_assignment" > Construction and Assignment</ a ></ li >
< li >< a href = "#overview_inspecting_the_value" > Inspecting the Value</ a ></ li >
< li >< a href = "#overview_visitation" > Visitation</ a ></ li >
< li >< a href = "#overview_default_construction" > Default Construction</ a ></ li >
</ ul >
</ li >
2019-02-22 19:19:36 +02:00
< li >< a href = "#reference" > Reference</ a >
< ul class = "sectlevel2" >
< li >< a href = "#ref_boostvariant2variant_hpp" > < boost/variant2/variant.hpp> </ a >
< ul class = "sectlevel3" >
< li >< a href = "#ref_synopsis" > Synopsis</ a ></ li >
< li >< a href = "#ref_variant" > variant</ a >
< ul class = "sectlevel4" >
< li >< a href = "#ref_constructors" > Constructors</ a ></ li >
< li >< a href = "#ref_destructor" > Destructor</ a ></ li >
< li >< a href = "#ref_assignment" > Assignment</ a ></ li >
< li >< a href = "#ref_modifiers" > Modifiers</ a ></ li >
< li >< a href = "#ref_value_status" > Value Status</ a ></ li >
< li >< a href = "#ref_swap" > Swap</ a ></ li >
< li >< a href = "#ref_converting_constructors_extension" > Converting Constructors (extension)</ a ></ li >
< li >< a href = "#ref_subset_extension" > Subset (extension)</ a ></ li >
</ ul >
</ li >
< li >< a href = "#ref_variant_alternative" > variant_alternative</ a ></ li >
< li >< a href = "#ref_holds_alternative" > holds_alternative</ a ></ li >
< li >< a href = "#ref_get" > get</ a ></ li >
< li >< a href = "#ref_get_if" > get_if</ a ></ li >
< li >< a href = "#ref_relational_operators" > Relational Operators</ a ></ li >
< li >< a href = "#ref_visit" > visit</ a ></ li >
< li >< a href = "#ref_swap_2" > swap</ a ></ li >
< li >< a href = "#ref_bad_variant_access" > bad_variant_access</ a ></ li >
</ ul >
</ li >
</ ul >
</ li >
< li >< a href = "#copyright" > Copyright and License</ a ></ li >
</ ul >
</ div >
</ div >
< div id = "content" >
< div class = "sect1" >
< h2 id = "overview" > Overview</ h2 >
< div class = "sectionbody" >
2019-05-12 00:13:38 +03:00
< div class = "sect2" >
< h3 id = "overview_description" > Description</ h3 >
2019-02-22 19:19:36 +02:00
< div class = "paragraph" >
2019-05-11 21:06:44 +03:00
< p > This library implements a type-safe discriminated/tagged union type,
< code > variant< T…​> </ code > , that is API-compatible with the C++ 17 Standard’ s
< a href = "http://en.cppreference.com/w/cpp/utility/variant" >< code > std::variant< T…​> </ code ></ a > .</ p >
2019-02-22 19:19:36 +02:00
</ div >
< div class = "paragraph" >
2019-05-11 21:06:44 +03:00
< p > A < code > variant< T1, T2, …​ , Tn> </ code > variable can hold a value of any of the
types < code > T1</ code > , < code > T2</ code > , …​ , < code > Tn</ code > . For example,
< code > variant< int64_t, double, std::string> </ code > can hold an < code > int64_t</ code > value, a
< code > double</ code > value, or a < code > string</ code > value.</ p >
2019-02-22 19:19:36 +02:00
</ div >
< div class = "paragraph" >
2019-05-11 21:06:44 +03:00
< p > Such a type is sometimes called a "tagged union", because it’ s roughly
equivalent to</ p >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > struct V
{
enum tag { tag_int64_t, tag_double, tag_string };
tag tag_;
union
{
int64_t i_;
double d_;
std::string s_;
};
};</ code ></ pre >
</ div >
</ div >
2019-05-12 00:13:38 +03:00
</ div >
< div class = "sect2" >
< h3 id = "overview_usage_examples" > Usage Examples</ h3 >
2019-05-11 21:06:44 +03:00
< div class = "paragraph" >
< p > Variants can be used to represent dynamically-typed values. A configuration
file of the form</ p >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > server.host=test.example.com
server.port=9174
cache.max_load=0.7</ code ></ pre >
</ div >
</ div >
< div class = "paragraph" >
< p > can be represented as < code > std::map< std::string, variant< int64_t, double,
std::string>> </ code > .</ p >
</ div >
< div class = "paragraph" >
< p > Variants can also represent polymorphism. To take a classic example, a
polymorphic collection of shapes:</ p >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > #define _USE_MATH_DEFINES
#include < iostream>
#include < vector>
#include < memory>
#include < cmath>
class Shape
{
public:
virtual ~Shape() = default;
virtual double area() const = 0;
};
class Rectangle: public Shape
{
private:
double width_, height_;
public:
Rectangle( double width, double height ):
width_( width ), height_( height ) {}
virtual double area() const { return width_ * height_; }
};
class Circle: public Shape
{
private:
double radius_;
public:
explicit Circle( double radius ): radius_( radius ) {}
virtual double area() const { return M_PI * radius_ * radius_; }
};
double total_area( std::vector< std::unique_ptr< Shape>> const & v )
{
double s = 0.0;
for( auto const& p: v )
{
s += p-> area();
}
return s;
}
int main()
{
std::vector< std::unique_ptr< Shape>> v;
v.push_back( std::unique_ptr< Shape> ( new Circle( 1.0 ) ) );
v.push_back( std::unique_ptr< Shape> ( new Rectangle( 2.0, 3.0 ) ) );
std::cout << "Total area: " << total_area( v ) << std::endl;
}</ code ></ pre >
</ div >
</ div >
< div class = "paragraph" >
< p > can instead be represented as a collection of < code > variant< Rectangle, Circle> </ code >
values. This requires the possible < code > Shape</ code > types be known in advance, as is
often the case. In return, we no longer need virtual functions, or to allocate
the values on the heap with < code > new Rectangle</ code > and < code > new Circle</ code > :</ p >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > #define _USE_MATH_DEFINES
#include < iostream>
#include < vector>
#include < cmath>
#include < boost/variant2/variant.hpp>
using namespace boost::variant2;
struct Rectangle
{
double width_, height_;
double area() const { return width_ * height_; }
};
struct Circle
{
double radius_;
double area() const { return M_PI * radius_ * radius_; }
};
double total_area( std::vector< variant< Rectangle, Circle>> const & v )
{
double s = 0.0;
for( auto const& x: v )
{
s += visit( []( auto const& y ){ return y.area(); }, x );
}
return s;
}
int main()
{
std::vector< variant< Rectangle, Circle>> v;
v.push_back( Circle{ 1.0 } );
v.push_back( Rectangle{ 2.0, 3.0 } );
std::cout << "Total area: " << total_area( v ) << std::endl;
}</ code ></ pre >
</ div >
</ div >
2019-05-12 00:13:38 +03:00
</ div >
< div class = "sect2" >
< h3 id = "overview_construction_and_assignment" > Construction and Assignment</ h3 >
2019-05-11 21:06:44 +03:00
< div class = "paragraph" >
< p > If we look at the</ p >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > v.push_back( Circle{ 1.0 } );</ code ></ pre >
</ div >
</ div >
< div class = "paragraph" >
< p > line, we can deduce that < code > variant< Rectangle, Circle> </ code > can be (implicitly)
constructed from < code > Circle</ code > (and < code > Rectangle</ code > ), and indeed it can. It can also
be assigned a < code > Circle</ code > or a < code > Rectangle</ code > :</ p >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > variant< Rectangle, Circle> v = Circle{ 1.0 }; // v holds Circle
v = Rectangle{ 2.0, 3.0 }; // v now holds Rectangle</ code ></ pre >
</ div >
</ div >
< div class = "paragraph" >
< p > If we try to construct < code > variant< int, float> </ code > from something that is neither
< code > int</ code > nor < code > float</ code > , say, < code > (short)1</ code > , the behavior is "as if" the < code > variant</ code > has
declared two constructors,</ p >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > variant::variant(int x);
variant::variant(float x);</ code ></ pre >
</ div >
</ div >
< div class = "paragraph" >
< p > and the standard overload resolution rules are used to pick the one that will
be used. So < code > variant< int, float> ((short)1)</ code > will hold an < code > int</ code > .</ p >
</ div >
2019-05-12 00:13:38 +03:00
</ div >
< div class = "sect2" >
< h3 id = "overview_inspecting_the_value" > Inspecting the Value</ h3 >
2019-05-11 21:06:44 +03:00
< div class = "paragraph" >
< p > Putting values into a < code > variant</ code > is easy, but taking them out is necessarily a
bit more convoluted. It’ s not possible for < code > variant< int, float> </ code > to define a
member function < code > get() const</ code > , because such a function will need its return
type fixed at compile time, and whether the correct return type is < code > int</ code > or
< code > float</ code > will only become known at run time.</ p >
</ div >
< div class = "paragraph" >
< p > There are a few ways around that. First, there is the accessor member function</ p >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > std::size_t variant::index() const noexcept;</ code ></ pre >
</ div >
</ div >
< div class = "paragraph" >
< p > that returns the zero-based index of the current type. For < code > variant< int,
float> </ code > , it will return < code > 0</ code > for < code > int</ code > and < code > 1</ code > for < code > float</ code > .</ p >
</ div >
< div class = "paragraph" >
< p > Once we have the index, we can use the free function < code > get< N> </ code > to obtain the
value. Since we’ re passing the type index to < code > get</ code > , it knows what to return.
< code > get< 0> (v)</ code > will return < code > int</ code > , and < code > get< 1> (v)</ code > will return < code > float</ code > :</ p >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > void f( variant< int, float> const& v )
{
switch( v.index() )
{
case 0:
// use get< 0> (v)
break;
case 1:
// use get< 1> (v)
break;
default:
assert(false); // never happens
}
}</ code ></ pre >
</ div >
</ div >
< div class = "paragraph" >
< p > If we call < code > get< 0> (v)</ code > , and < code > v.index()</ code > is not currently < code > 0</ code > , an exception
(of type < code > bad_variant_access</ code > ) will be thrown.</ p >
</ div >
< div class = "paragraph" >
< p > An alternative approach is to use < code > get< int> (v)</ code > or < code > get< float> (v)</ code > . This
works similarly.</ p >
</ div >
< div class = "paragraph" >
< p > Another alternative that avoids the possibility of < code > bad_variant_access</ code > is
to use < code > get_if</ code > . Instead of a reference to the contained value, it returns
a pointer to it, returning < code > nullptr</ code > to indicate type mismatch. < code > get_if</ code >
takes a pointer to the < code > variant</ code > , so in our example we’ ll use something along
the following lines:</ p >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > void f( variant< int, float> const& v )
{
if( int const * p = get_if< int> (& v) )
{
// use *p
}
else if( float const * p = get_if< float> (& v) )
{
// use *p
}
else
{
assert(false); // never happens
}
}</ code ></ pre >
</ div >
</ div >
2019-05-12 00:13:38 +03:00
</ div >
< div class = "sect2" >
< h3 id = "overview_visitation" > Visitation</ h3 >
2019-05-11 21:06:44 +03:00
< div class = "paragraph" >
< p > Last but not least, there’ s < code > visit</ code > . < code > visit(f, v)</ code > calls the a function object
< code > f</ code > with the value contained in the < code > variant</ code > < code > v</ code > and returns the result. When
< code > v</ code > is < code > variant< int, float> </ code > , it will call < code > f</ code > with either an < code > int</ code > or a
< code > float</ code > . The function object must be prepared to accept both.</ p >
</ div >
< div class = "paragraph" >
< p > In practice, this can be achieved by having the function take a type that can
be passed either < code > int</ code > or < code > float</ code > , such as < code > double</ code > :</ p >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > double f( double x ) { return x; }
double g( variant< int, float> const& v )
{
return visit( f, v );
}</ code ></ pre >
</ div >
</ div >
< div class = "paragraph" >
< p > By using a function object with an overloaded < code > operator()</ code > :</ p >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > struct F
{
void operator()(int x) const { /* use x */ }
void operator()(float x) const { /* use x */ }
};
void g( variant< int, float> const& v )
{
visit( F(), v );
}</ code ></ pre >
</ div >
</ div >
< div class = "paragraph" >
< p > Or by using a polymorphic lambda, as we did in our < code > Circle</ code > /< code > Rectangle</ code >
example:</ p >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > void g( variant< int, float> const& v )
{
visit( [& ]( auto const& x ){ std::cout << x << std::endl; }, v );
}</ code ></ pre >
</ div >
</ div >
< div class = "paragraph" >
< p >< code > visit</ code > can also take more than one < code > variant</ code > . < code > visit(f, v1, v2)</ code > calls
< code > f(x1, x2)</ code > , where < code > x1</ code > is the value contained in < code > v1</ code > and < code > x2</ code > is the value
in < code > v2</ code > .</ p >
</ div >
2019-05-12 00:13:38 +03:00
</ div >
< div class = "sect2" >
< h3 id = "overview_default_construction" > Default Construction</ h3 >
2019-05-11 21:06:44 +03:00
< div class = "paragraph" >
< p > The default constructor of < code > variant</ code > value-initializes the first type in
the list. < code > variant< int, float> {}</ code > holds < code > 0</ code > (of type < code > int</ code > ), and
< code > variant< float, int> {}</ code > holds < code > 0.0f</ code > .</ p >
</ div >
< div class = "paragraph" >
< p > This is usually the desired behavior. However, in cases such as
< code > variant< std::mutex, std::recursive_mutex> </ code > , one might legitimately wish to
avoid constructing a < code > std::mutex</ code > by default. A provided type, < code > monostate</ code > ,
can be used as the first type in those scenarios. < code > variant< monostate,
std::mutex, std::recursive_mutex> </ code > will default-construct a < code > monostate</ code > ,
which is basically a no-op, as < code > monostate</ code > is effectively an empty < code > struct</ code > .</ p >
2019-02-22 19:19:36 +02:00
</ div >
</ div >
</ div >
2019-05-12 00:13:38 +03:00
</ div >
2019-02-22 19:19:36 +02:00
< div class = "sect1" >
< h2 id = "reference" > Reference</ h2 >
< div class = "sectionbody" >
< div class = "sect2" >
< h3 id = "ref_boostvariant2variant_hpp" > < boost/variant2/variant.hpp> </ h3 >
< div class = "sect3" >
< h4 id = "ref_synopsis" > Synopsis</ h4 >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > namespace boost {
namespace variant2 {
// in_place_type
template< class T> struct in_place_type_t {};
template< class T> constexpr in_place_type_t< T> in_place_type{};
// in_place_index
template< std::size_t I> struct in_place_index_t {};
template< std::size_t I> constexpr in_place_index_t< I> in_place_index{};
// variant
template< class... T> class variant;
// variant_size
template< class T> struct variant_size {};
template< class T> struct variant_size< T const> : variant_size< T> {};
template< class T> struct variant_size< T volatile> : variant_size< T> {};
template< class T> struct variant_size< T const volatile> : variant_size< T> {};
template< class T> struct variant_size< T&> : variant_size< T> {}; // extension
template< class T> struct variant_size< T&&> : variant_size< T> {}; // extension
template< class T>
inline constexpr size_t variant_size_v = variant_size< T> ::value;
template< class... T>
struct variant_size< variant< T...>> :
std::integral_constant< std::size_t, sizeof...(T)> {};
// variant_alternative
template< size_t I, class T> struct variant_alternative {};
template< size_t I, class T> struct variant_alternative< I, T const> ;
template< size_t I, class T> struct variant_alternative< I, T volatile> ;
template< size_t I, class T> struct variant_alternative< I, T const volatile> ;
template< size_t I, class T> struct variant_alternative< I, T&> ; // extension
template< size_t I, class T> struct variant_alternative< I, T&&> ; // extension
template< size_t I, class T>
using variant_alternative_t = typename variant_alternative< I, T> ::type;
template< size_t I, class... T>
struct variant_alternative< I, variant< T...>> ;
// variant_npos
constexpr std::size_t variant_npos = -1;
// holds_alternative
template< class U, class... T>
constexpr bool holds_alternative(const variant< T...>& v) noexcept;
// get
template< size_t I, class... T>
constexpr variant_alternative_t< I, variant< T...>>&
get(variant< T...>& v);
template< size_t I, class... T>
constexpr variant_alternative_t< I, variant< T...>>&&
get(variant< T...>&& v);
template< size_t I, class... T>
constexpr const variant_alternative_t< I, variant< T...>>&
get(const variant< T...>& v);
template< size_t I, class... T>
constexpr const variant_alternative_t< I, variant< T...>>&&
get(const variant< T...>&& v);
template< class U, class... T>
constexpr U& get(variant< T...>& v);
template< class U, class... T>
constexpr U&& get(variant< T...>&& v);
template< class U, class... T>
constexpr const U& get(const variant< T...>& v);
template< class U, class... T>
constexpr const U&& get(const variant< T...>&& v);
// get_if
template< size_t I, class... T>
constexpr add_pointer_t< variant_alternative_t< I, variant< T...>>>
get_if(variant< T...> * v) noexcept;
template< size_t I, class... T>
constexpr add_pointer_t< const variant_alternative_t< I, variant< T...>>>
get_if(const variant< T...> * v) noexcept;
template< class U, class... T>
constexpr add_pointer_t< U>
get_if(variant< T...> * v) noexcept;
template< class U, class... T>
constexpr add_pointer_t< const U>
get_if(const variant< T...> * v) noexcept;
// relational operators
template< class... T>
constexpr bool operator==(const variant< T...>& v, const variant< T...>& w);
template< class... T>
constexpr bool operator!=(const variant< T...>& v, const variant< T...>& w);
template< class... T>
constexpr bool operator< (const variant< T...>& v, const variant< T...>& w);
template< class... T>
constexpr bool operator> (const variant< T...>& v, const variant< T...>& w);
template< class... T>
constexpr bool operator< =(const variant< T...>& v, const variant< T...>& w);
template< class... T>
constexpr bool operator> =(const variant< T...>& v, const variant< T...>& w);
// visit
template< class F, class... V>
constexpr /*see below*/ visit(F&& f, V&& ... v);
// monostate
struct monostate {};
constexpr bool operator==(monostate, monostate) noexcept { return true; }
constexpr bool operator!=(monostate, monostate) noexcept { return false; }
constexpr bool operator< (monostate, monostate) noexcept { return false; }
constexpr bool operator> (monostate, monostate) noexcept { return false; }
constexpr bool operator< =(monostate, monostate) noexcept { return true; }
constexpr bool operator> =(monostate, monostate) noexcept { return true; }
// swap
template< class... T>
void swap(variant< T...>& v, variant< T...>& w) noexcept( /*see below*/ );
// bad_variant_access
class bad_variant_access;
} // namespace variant2
} // namespace boost</ code ></ pre >
</ div >
</ div >
</ div >
< div class = "sect3" >
< h4 id = "ref_variant" > variant</ h4 >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > namespace boost {
namespace variant2 {
template< class... T> class variant
{
public:
// constructors
constexpr variant() noexcept( /*see below*/ );
constexpr variant( variant const & r ) noexcept( /*see below*/ );
constexpr variant( variant&& r ) noexcept( /*see below*/ );
template< class U>
constexpr variant( U&& u ) noexcept( /*see below*/ );
template< class U, class... A>
constexpr explicit variant( in_place_type_t< U> , A&& ... a );
template< class U, class V, class... A>
constexpr explicit variant( in_place_type_t< U> ,
std::initializer_list< V> il, A&& ... a );
template< size_t I, class... A>
constexpr explicit variant( in_place_index_t< I> , A&& ... a );
template< size_t I, class V, class... A>
constexpr explicit variant( in_place_index_t< I> ,
std::initializer_list< V> il, A&& ... a );
// destructor
~variant();
// assignment
constexpr variant& operator=( variant const & r ) noexcept( /*see below*/ );
constexpr variant& operator=( variant&& r ) noexcept( /*see below*/ );
template< class U> constexpr variant& operator=( U&& u ) noexcept( /*see below*/ );
// modifiers
template< class U, class... A>
constexpr U& emplace( A&& ... a );
template< class U, class V, class... A>
constexpr U& emplace( std::initializer_list< V> il, A&& ... a );
template< size_t I, class... A>
constexpr variant_alternative_t< I, variant< T...>>&
emplace( A&& ... a );
template< size_t I, class V, class... A>
constexpr variant_alternative_t< I, variant< T...>>&
emplace( std::initializer_list< V> il, A&& ... a );
// value status
constexpr bool valueless_by_exception() const noexcept;
constexpr size_t index() const noexcept;
// swap
void swap( variant& r ) noexcept( /*see below*/ );
// converting constructors (extension)
template< class... U> variant( variant< U...> const& r )
noexcept( /*see below*/ );
template< class... U> variant( variant< U...>&& r )
noexcept( /*see below*/ );
// subset (extension)
template< class... U> constexpr variant< U...> subset() & ;
template< class... U> constexpr variant< U...> subset() && ;
template< class... U> constexpr variant< U...> subset() const& ;
template< class... U> constexpr variant< U...> subset() const&& ;
};
} // namespace variant2
} // namespace boost</ code ></ pre >
</ div >
</ div >
< div class = "sect4" >
< h5 id = "ref_constructors" > Constructors</ h5 >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > constexpr variant() noexcept( std::is_nothrow_default_constructible_v< T0> );</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > Constructs a < code > variant</ code > holding a value-initialized value of
type < code > T0</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Ensures: </ dt >
< dd >
< p >< code > index() == 0</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Throws: </ dt >
< dd >
< p > Any exception thrown by the value-initialization of < code > T0</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
< p > This function does not participate in overload resolution unless
< code > std::is_default_constructible_v< T0> </ code > is < code > true</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > constexpr variant( variant const & w )
noexcept( mp_all< std::is_nothrow_copy_constructible< T> ...> ::value );</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > Initializes the variant to hold the same alternative and value as
< code > w</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Throws: </ dt >
< dd >
< p > Any exception thrown by the initialization of the contained value.</ p >
</ dd >
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
< p > This function does not participate in overload resolution unless
< code > std::is_copy_constructible_v< Ti> </ code > is < code > true</ code > for all < code > i</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > constexpr variant( variant&& w )
noexcept( mp_all< std::is_nothrow_move_constructible< T> ...> ::value );</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > Initializes the variant to hold the same alternative and value as
< code > w</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Throws: </ dt >
< dd >
< p > Any exception thrown by the move-initialization of the contained
value.</ p >
</ dd >
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
< p > This function does not participate in overload resolution unless
< code > std::is_move_constructible_v< Ti> </ code > is < code > true</ code > for all < code > i</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class U> constexpr variant( U&& u ) noexcept(/*see below*/);</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "paragraph" >
< p > Let < code > Tj</ code > be a type that is determined as follows: build an imaginary function
< code > FUN(Ti)</ code > for each alternative type < code > Ti</ code > . The overload < code > FUN(Tj)</ code > selected by
overload resolution for the expression < code > FUN(std::forward< U> (u))</ code > defines the
alternative < code > Tj</ code > which is the type of the contained value after construction.</ p >
</ div >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > Initializes < code > *this</ code > to hold the alternative type < code > Tj</ code > and
initializes the contained value from < code > std::forward< U> (u)</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Ensures: </ dt >
< dd >
< p >< code > holds_alternative< Tj> (*this)</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Throws: </ dt >
< dd >
< p > Any exception thrown by the initialization of the contained value.</ p >
</ dd >
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
< p > The expression inside < code > noexcept</ code > is equivalent to
< code > std::is_nothrow_constructible_v< Tj, U> </ code > . This function does not participate in
overload resolution unless</ p >
< div class = "ulist" >
< ul >
< li >
< p >< code > sizeof…​ (T)</ code > is nonzero,</ p >
</ li >
< li >
< p >< code > std::is_same_v< std::remove_cvref_t< U> , variant> </ code > is < code > false</ code > ,</ p >
</ li >
< li >
< p >< code > std::remove_cvref_t< U> </ code > is neither a specialization of < code > in_place_type_t</ code > nor a
specialization of < code > in_place_index_t</ code > ,</ p >
</ li >
< li >
< p >< code > std::is_constructible_v< Tj, U> </ code > is < code > true</ code > , and</ p >
</ li >
< li >
< p > the expression < code > FUN(std::forward< U> (u))</ code > is well-formed.</ p >
</ li >
</ ul >
</ div >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class U, class... A>
constexpr explicit variant( in_place_type_t< U> , A&& ... a );</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > Initializes the contained value of type < code > U</ code > with the arguments
< code > std::forward< A> (a)…​ </ code > .</ p >
</ dd >
< dt class = "hdlist1" > Ensures: </ dt >
< dd >
< p >< code > holds_alternative< U> (*this)</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Throws: </ dt >
< dd >
< p > Any exception thrown by the initialization of the contained value.</ p >
</ dd >
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
< p > This function does not participate in overload resolution unless
there is exactly one occurrence of < code > U</ code > in < code > T…​ </ code > and
< code > std::is_constructible_v< U, A…​> </ code > is true.</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class U, class V, class... A>
constexpr explicit variant( in_place_type_t< U> , std::initializer_list< V> il,
A&& ... a );</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > Initializes the contained value of type < code > U</ code > with the arguments < code > il</ code > ,
< code > std::forward< A> (a)…​ </ code > .</ p >
</ dd >
< dt class = "hdlist1" > Ensures: </ dt >
< dd >
< p >< code > holds_alternative< U> (*this)</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Throws: </ dt >
< dd >
< p > Any exception thrown by the initialization of the contained value.</ p >
</ dd >
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
< p > This function does not participate in overload resolution unless
there is exactly one occurrence of < code > U</ code > in < code > T…​ </ code > and
< code > std::is_constructible_v< U, initializer_list< V>& , A…​> </ code > is < code > true</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< size_t I, class... A>
constexpr explicit variant( in_place_index_t< I> , A&& ... a );</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > Initializes the contained value of type < code > TI</ code > with the arguments
< code > std::forward< A> (a)…​ </ code > .</ p >
</ dd >
< dt class = "hdlist1" > Ensures: </ dt >
< dd >
< p >< code > index() == I</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Throws: </ dt >
< dd >
< p > Any exception thrown by the initialization of the contained value.</ p >
</ dd >
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
< p > This function does not participate in overload resolution unless
< code > I < sizeof…​ (T)</ code > and < code > std::is_constructible_v< TI, A…​> </ code > is < code > true</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< size_t I, class V, class... A>
constexpr explicit variant( in_place_index_t< I> , std::initializer_list< V> il,
A&& ... a );</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > Initializes the contained value of type < code > TI</ code > with the arguments
< code > il</ code > , < code > std::forward< A> (a)…​ </ code > .</ p >
</ dd >
< dt class = "hdlist1" > Ensures: </ dt >
< dd >
< p >< code > index() == I</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Throws: </ dt >
< dd >
< p > Any exception thrown by the initialization of the contained value.</ p >
</ dd >
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
< p > This function does not participate in overload resolution unless
< code > I < sizeof…​ (T)</ code > and
< code > std::is_constructible_v< TI, initializer_list< V>& , A…​> </ code > is < code > true</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
</ div >
< div class = "sect4" >
< h5 id = "ref_destructor" > Destructor</ h5 >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > ~variant();</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > Destroys the currently contained value.</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
</ div >
< div class = "sect4" >
< h5 id = "ref_assignment" > Assignment</ h5 >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > constexpr variant& operator=( const variant& r )
2019-05-12 02:02:58 +03:00
noexcept( mp_all< std::is_nothrow_copy_constructible< T> ...> ::value );</ code ></ pre >
2019-02-22 19:19:36 +02:00
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "paragraph" >
< p > Let < code > j</ code > be < code > r.index()</ code > .</ p >
</ div >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
2019-05-12 02:02:58 +03:00
< p >< code > emplace< j> (get< j> (r))</ code > .</ p >
2019-02-22 19:19:36 +02:00
</ dd >
< dt class = "hdlist1" > Returns: </ dt >
< dd >
< p >< code > *this</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Ensures: </ dt >
< dd >
< p >< code > index() == r.index()</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
< p > This operator does not participate in overload resolution unless
< code > std::is_copy_constructible_v< Ti> && std::is_copy_assignable_v< Ti> </ code > is
< code > true</ code > for all < code > i</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > constexpr variant& operator=( variant&& r )
2019-05-12 02:02:58 +03:00
noexcept( mp_all< std::is_nothrow_move_constructible< T> ...> ::value );</ code ></ pre >
2019-02-22 19:19:36 +02:00
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "paragraph" >
< p > Let < code > j</ code > be < code > r.index()</ code > .</ p >
</ div >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
2019-05-12 02:02:58 +03:00
< p >< code > emplace< j> (get< j> (std::move(r)))</ code > .</ p >
2019-02-22 19:19:36 +02:00
</ dd >
< dt class = "hdlist1" > Returns: </ dt >
< dd >
< p >< code > *this</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Ensures: </ dt >
< dd >
< p >< code > index() == r.index()</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
< p > This operator does not participate in overload resolution unless
< code > std::is_move_constructible_v< Ti> && std::is_move_assignable_v< Ti> </ code > is
< code > true</ code > for all < code > i</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class U> constexpr variant& operator=( U&& u )
noexcept( /*see below*/ );</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "paragraph" >
< p > Let < code > Tj</ code > be a type that is determined as follows: build an imaginary function
< code > FUN(Ti)</ code > for each alternative type < code > Ti</ code > . The overload < code > FUN(Tj)</ code > selected by
overload resolution for the expression < code > FUN(std::forward< U> (u))</ code > defines the
alternative < code > Tj</ code > which is the type of the contained value after construction.</ p >
</ div >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
2019-05-12 02:02:58 +03:00
< p >< code > emplace< j> (std::forward< U> (u))</ code > .</ p >
2019-02-22 19:19:36 +02:00
</ dd >
< dt class = "hdlist1" > Returns: </ dt >
< dd >
< p >< code > *this</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Ensures: </ dt >
< dd >
< p >< code > index() == j</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
2019-05-12 02:02:58 +03:00
< p > The expression inside < code > noexcept</ code > is < code > std::is_nothrow_constructible_v< Tj, U&&> </ code > .
2019-02-22 19:19:36 +02:00
This operator does not participate in overload resolution unless</ p >
< div class = "ulist" >
< ul >
< li >
< p >< code > std::is_same_v< std::remove_cvref_t< T> , variant> </ code > is < code > false</ code > ,</ p >
</ li >
< li >
2019-05-12 02:02:58 +03:00
< p >< code > std::is_constructible_v< Tj, U&&> && std::is_assignable_v< Tj& , U&&> </ code > is
2019-02-22 19:19:36 +02:00
< code > true</ code > , and</ p >
</ li >
< li >
< p > the expression < code > FUN(std::forward< U> (u))</ code > (with < code > FUN</ code > being the
above-mentioned set of imaginary functions) is well-formed.</ p >
</ li >
</ ul >
</ div >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
</ div >
< div class = "sect4" >
< h5 id = "ref_modifiers" > Modifiers</ h5 >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class U, class... A>
constexpr U& emplace( A&& ... a );</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "paragraph" >
< p > Let < code > I</ code > be the zero-based index of < code > U</ code > in < code > T…​ </ code > .</ p >
</ div >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > Equivalent to: < code > return emplace< I> (std::forward< A> (a)…​ );</ code ></ p >
</ dd >
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
< p > This function shall not participate in overload resolution unless
2019-05-12 02:02:58 +03:00
< code > std::is_constructible_v< U, A&&…​> </ code > is < code > true</ code > and < code > U</ code > occurs exactly once
2019-02-22 19:19:36 +02:00
in < code > T…​ </ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class U, class V, class... A>
constexpr U& emplace( std::initializer_list< V> il, A&& ... a );</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "paragraph" >
< p > Let < code > I</ code > be the zero-based index of < code > U</ code > in < code > T…​ </ code > .</ p >
</ div >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > Equivalent to: < code > return emplace< I> (il, std::forward< A> (a)…​ );</ code ></ p >
</ dd >
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
< p > This function shall not participate in overload resolution unless
2019-05-12 02:02:58 +03:00
< code > std::is_constructible_v< U, std::initializer_list< V>& , A&&…​> </ code > is < code > true</ code >
2019-02-22 19:19:36 +02:00
and < code > U</ code > occurs exactly once in < code > T…​ </ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< size_t I, class... A>
constexpr variant_alternative_t< I, variant< T...>>&
emplace( A&& ... a );</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Requires: </ dt >
< dd >
2019-03-25 16:35:27 +02:00
< p >< code > I < sizeof…​ (T)</ code > .</ p >
2019-02-22 19:19:36 +02:00
</ dd >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > Destroys the currently contained value, then initializes a new contained
value as if using the expression < code > Ti(std::forward< A> (a)…​ )</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Ensures: </ dt >
< dd >
< p >< code > index() == I</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Returns: </ dt >
< dd >
< p > A reference to the new contained value.</ p >
</ dd >
2019-03-25 16:35:27 +02:00
< dt class = "hdlist1" > Throws: </ dt >
< dd >
< p > Nothing unless the initialization of the new contained value throws.</ p >
</ dd >
< dt class = "hdlist1" > Exception Safety: </ dt >
< dd >
2019-05-12 02:02:58 +03:00
< p > Strong. On exception, the contained value is unchanged.</ p >
2019-03-25 16:35:27 +02:00
</ dd >
2019-02-22 19:19:36 +02:00
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
< p > This function shall not participate in overload resolution unless
2019-05-12 02:02:58 +03:00
< code > std::is_constructible_v< Ti, A&&…​> </ code > is < code > true</ code > .</ p >
2019-02-22 19:19:36 +02:00
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< size_t I, class V, class... A>
constexpr variant_alternative_t< I, variant< T...>>&
emplace( std::initializer_list< V> il, A&& ... a );</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Requires: </ dt >
< dd >
2019-03-25 16:35:27 +02:00
< p >< code > I < sizeof…​ (T)</ code > .</ p >
2019-02-22 19:19:36 +02:00
</ dd >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > Destroys the currently contained value, then initializes a new contained
value as if using the expression < code > Ti(il, std::forward< A> (a)…​ )</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Ensures: </ dt >
< dd >
< p >< code > index() == I</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Returns: </ dt >
< dd >
< p > A reference to the new contained value.</ p >
</ dd >
2019-03-25 16:35:27 +02:00
< dt class = "hdlist1" > Throws: </ dt >
< dd >
< p > Nothing unless the initialization of the new contained value throws.</ p >
</ dd >
< dt class = "hdlist1" > Exception Safety: </ dt >
< dd >
2019-05-12 02:02:58 +03:00
< p > Strong. On exception, the contained value is unchanged.</ p >
2019-03-25 16:35:27 +02:00
</ dd >
2019-02-22 19:19:36 +02:00
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
< p > This function shall not participate in overload resolution unless
2019-05-12 02:02:58 +03:00
< code > std::is_constructible_v< Ti, std::initializer_list< V>& , A&&…​> </ code > is < code > true</ code > .</ p >
2019-02-22 19:19:36 +02:00
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
</ div >
< div class = "sect4" >
< h5 id = "ref_value_status" > Value Status</ h5 >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > constexpr bool valueless_by_exception() const noexcept;</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Returns: </ dt >
< dd >
< p >< code > false</ code > .</ p >
</ dd >
</ dl >
</ div >
2019-05-12 02:02:58 +03:00
< div class = "admonitionblock note" >
< table >
< tr >
< td class = "icon" >
< div class = "title" > Note</ div >
</ td >
< td class = "content" >
This function is provided purely for compatibility with < code > std::variant</ code > .
</ td >
</ tr >
</ table >
</ div >
2019-02-22 19:19:36 +02:00
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > constexpr size_t index() const noexcept;</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Returns: </ dt >
< dd >
< p > The zero-based index of the active alternative.</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
</ div >
< div class = "sect4" >
< h5 id = "ref_swap" > Swap</ h5 >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > void swap( variant& r ) noexcept( mp_all< std::is_nothrow_move_constructible< T> ...,
is_nothrow_swappable< T> ...> ::value );</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< div class = "ulist" >
< ul >
< li >
< p > If < code > index() == r.index()</ code > , calls < code > swap(get< I> (*this), get< I> (r))</ code > ,
where < code > I</ code > is < code > index()</ code > .</ p >
</ li >
< li >
< p > Otherwise, as if
< code > variant tmp(std::move(*this)); *this = std::move(r); r = std::move(tmp);</ code ></ p >
</ li >
</ ul >
</ div >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
</ div >
< div class = "sect4" >
< h5 id = "ref_converting_constructors_extension" > Converting Constructors (extension)</ h5 >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class... U> variant( variant< U...> const& r )
noexcept( mp_all< std::is_nothrow_copy_constructible< U> ...> ::value );</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > Initializes the contained value from the contained value of < code > r</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Throws: </ dt >
< dd >
< p > Any exception thrown by the initialization of the contained value.</ p >
</ dd >
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
< p > This function does not participate in overload resolution unless
all types in < code > U…​ </ code > are in < code > T…​ </ code > and
< code > std::is_copy_constructible_v< Ui> ::value</ code > is < code > true</ code > for all < code > Ui</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class... U> variant( variant< U...>&& r )
noexcept( mp_all< std::is_nothrow_move_constructible< U> ...> ::value );</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > Initializes the contained value from the contained value of
< code > std::move(r)</ code > .</ p >
</ dd >
< dt class = "hdlist1" > Throws: </ dt >
< dd >
< p > Any exception thrown by the initialization of the contained value.</ p >
</ dd >
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
< p > This function does not participate in overload resolution unless
all types in < code > U…​ </ code > are in < code > T…​ </ code > and
< code > std::is_move_constructible_v< Ui> ::value</ code > is < code > true</ code > for all < code > Ui</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
</ div >
< div class = "sect4" >
< h5 id = "ref_subset_extension" > Subset (extension)</ h5 >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class... U> constexpr variant< U...> subset() & ;</ code ></ pre >
</ div >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class... U> constexpr variant< U...> subset() const& ;</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Returns: </ dt >
< dd >
< p > A < code > variant< U…​> </ code > whose contained value is copy-initialized from
the contained value of < code > *this</ code > and has the same type.</ p >
</ dd >
< dt class = "hdlist1" > Throws: </ dt >
< dd >
< div class = "ulist" >
< ul >
< li >
< p > If the active alternative of < code > *this</ code > is not among the types in < code > U…​ </ code > ,
< code > bad_variant_access</ code > .</ p >
</ li >
< li >
< p > Otherwise, any exception thrown by the initialization of the contained value.</ p >
</ li >
</ ul >
</ div >
</ dd >
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
< p > This function does not participate in overload resolution unless
all types in < code > U…​ </ code > are in < code > T…​ </ code > and
< code > std::is_copy_constructible_v< Ui> ::value</ code > is < code > true</ code > for all < code > Ui</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class... U> constexpr variant< U...> subset() && ;</ code ></ pre >
</ div >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class... U> constexpr variant< U...> subset() const&& ;</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Returns: </ dt >
< dd >
< p > A < code > variant< U…​> </ code > whose contained value is move-initialized from
the contained value of < code > *this</ code > and has the same type.</ p >
</ dd >
< dt class = "hdlist1" > Throws: </ dt >
< dd >
< div class = "ulist" >
< ul >
< li >
< p > If the active alternative of < code > *this</ code > is not among the types in < code > U…​ </ code > ,
< code > bad_variant_access</ code > .</ p >
</ li >
< li >
< p > Otherwise, any exception thrown by the initialization of the contained value.</ p >
</ li >
</ ul >
</ div >
</ dd >
< dt class = "hdlist1" > Remarks: </ dt >
< dd >
< p > This function does not participate in overload resolution unless
all types in < code > U…​ </ code > are in < code > T…​ </ code > and
< code > std::is_move_constructible_v< Ui> ::value</ code > is < code > true</ code > for all < code > Ui</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
</ div >
</ div >
< div class = "sect3" >
< h4 id = "ref_variant_alternative" > variant_alternative</ h4 >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< size_t I, class T> struct variant_alternative< I, T const> ;</ code ></ pre >
</ div >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< size_t I, class T> struct variant_alternative< I, T volatile> ;</ code ></ pre >
</ div >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< size_t I, class T> struct variant_alternative< I, T const volatile> ;</ code ></ pre >
</ div >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< size_t I, class T> struct variant_alternative< I, T&> ; // extension</ code ></ pre >
</ div >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< size_t I, class T> struct variant_alternative< I, T&&> ; // extension</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "openblock" >
< div class = "content" >
< div class = "paragraph" >
< p > If < code > typename variant_alternative< I, T> ::type</ code > exists and is < code > U</ code > ,</ p >
</ div >
< div class = "ulist" >
< ul >
< li >
< p >< code > variant_alternative< I, T const> ::type</ code > is < code > U const</ code > ;</ p >
</ li >
< li >
< p >< code > variant_alternative< I, T volatile> ::type</ code > is < code > U volatile</ code > ;</ p >
</ li >
< li >
< p >< code > variant_alternative< I, T const volatile> ::type</ code > is < code > U const volatile</ code > .</ p >
</ li >
< li >
< p >< code > variant_alternative< I, T&> ::type</ code > is < code > U& </ code > .</ p >
</ li >
< li >
< p >< code > variant_alternative< I, T&&> ::type</ code > is < code > U&& </ code > .</ p >
</ li >
</ ul >
</ div >
< div class = "paragraph" >
< p > Otherwise, these structs have no member < code > type</ code > .</ p >
</ div >
</ div >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< size_t I, class... T>
struct variant_alternative< I, variant< T...>> ;</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "paragraph" >
< p > When < code > I < sizeof…​ (T)</ code > , the nested type < code > type</ code > is an alias for the < code > I</ code > -th
(zero-based) type in < code > T…​ </ code > . Otherwise, there is no member < code > type</ code > .</ p >
</ div >
</ li >
</ ul >
</ div >
</ div >
< div class = "sect3" >
< h4 id = "ref_holds_alternative" > holds_alternative</ h4 >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class U, class... T>
constexpr bool holds_alternative(const variant< T...>& v) noexcept;</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Requires: </ dt >
< dd >
< p > The type < code > U</ code > occurs exactly once in < code > T…​ </ code > . Otherwise, the
program is ill-formed.</ p >
</ dd >
< dt class = "hdlist1" > Returns: </ dt >
< dd >
< p >< code > true</ code > if < code > index()</ code > is equal to the zero-based index of < code > U</ code >
in < code > T…​ </ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
</ div >
< div class = "sect3" >
< h4 id = "ref_get" > get</ h4 >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< size_t I, class... T>
constexpr variant_alternative_t< I, variant< T...>>&
get(variant< T...>& v);</ code ></ pre >
</ div >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< size_t I, class... T>
constexpr variant_alternative_t< I, variant< T...>>&&
get(variant< T...>&& v);</ code ></ pre >
</ div >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< size_t I, class... T>
constexpr const variant_alternative_t< I, variant< T...>>&
get(const variant< T...>& v);</ code ></ pre >
</ div >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< size_t I, class... T>
constexpr const variant_alternative_t< I, variant< T...>>&&
get(const variant< T...>&& v);</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > If < code > v.index()</ code > is < code > I</ code > , returns a reference to the object stored in
the variant. Otherwise, throws < code > bad_variant_access</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class U, class... T>
constexpr U& get(variant< T...>& v);</ code ></ pre >
</ div >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class U, class... T>
constexpr U&& get(variant< T...>&& v);</ code ></ pre >
</ div >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class U, class... T>
constexpr const U& get(const variant< T...>& v);</ code ></ pre >
</ div >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class U, class... T>
constexpr const U&& get(const variant< T...>&& v);</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Requires: </ dt >
< dd >
< p > The type < code > U</ code > occurs exactly once in < code > T…​ </ code > . Otherwise, the
program is ill-formed.</ p >
</ dd >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > If < code > v</ code > holds a value of type < code > U</ code > , returns a reference to that value.
Otherwise, throws < code > bad_variant_access</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
</ div >
< div class = "sect3" >
< h4 id = "ref_get_if" > get_if</ h4 >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< size_t I, class... T>
constexpr add_pointer_t< variant_alternative_t< I, variant< T...>>>
get_if(variant< T...> * v) noexcept;</ code ></ pre >
</ div >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< size_t I, class... T>
constexpr add_pointer_t< const variant_alternative_t< I, variant< T...>>>
get_if(const variant< T...> * v) noexcept;</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Requires: </ dt >
< dd >
< p >< code > I < sizeof…​ (U)</ code > . Otherwise, the program is ill-formed.</ p >
</ dd >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > A pointer to the value stored in the variant, if
< code > v != nullptr && v-> index() == I</ code > . Otherwise, < code > nullptr</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class U, class... T>
constexpr add_pointer_t< U>
get_if(variant< T...> * v) noexcept;</ code ></ pre >
</ div >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class U, class... T>
constexpr add_pointer_t< const U>
get_if(const variant< T...> * v) noexcept;</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Requires: </ dt >
< dd >
< p > The type < code > U</ code > occurs exactly once in < code > T…​ </ code > . Otherwise, the
program is ill-formed.</ p >
</ dd >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > Equivalent to: < code > return get_if< I> (v);</ code > with < code > I</ code > being
the zero-based index of < code > U</ code > in < code > T…​ </ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
</ div >
< div class = "sect3" >
< h4 id = "ref_relational_operators" > Relational Operators</ h4 >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class... T>
constexpr bool operator==(const variant< T...>& v, const variant< T...>& w);</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Returns: </ dt >
< dd >
< p >< code > v.index() == w.index && get< I> (v) == get< I> (w)</ code > , where < code > I</ code >
is < code > v.index()</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class... T>
constexpr bool operator!=(const variant< T...>& v, const variant< T...>& w);</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Returns: </ dt >
< dd >
< p >< code > !(v == w)</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class... T>
constexpr bool operator< (const variant< T...>& v, const variant< T...>& w);</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Returns: </ dt >
< dd >
< p >< code > v.index() < w.index || (v.index() == w.index && get< I> (v) < get< I> (w))</ code > ,
where < code > I</ code > is < code > v.index()</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class... T>
constexpr bool operator> (const variant< T...>& v, const variant< T...>& w);</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Returns: </ dt >
< dd >
< p >< code > w < v</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class... T>
constexpr bool operator< =(const variant< T...>& v, const variant< T...>& w);</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Returns: </ dt >
< dd >
< p >< code > v.index() < w.index || (v.index() == w.index && get< I> (v) < = get< I> (w))</ code > ,
where < code > I</ code > is < code > v.index()</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class... T>
constexpr bool operator> =(const variant< T...>& v, const variant< T...>& w);</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Returns: </ dt >
< dd >
< p >< code > w < = v</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
</ div >
< div class = "sect3" >
< h4 id = "ref_visit" > visit</ h4 >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class F, class... V>
constexpr /*see below*/ visit(F&& f, V&& ... v);</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Returns: </ dt >
< dd >
< p >< code > std::forward< F> (f)(get< I> (std::forward< V> (v))…​ )</ code > , where
< code > I…​ </ code > is < code > v.index()…​ </ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
</ div >
< div class = "sect3" >
< h4 id = "ref_swap_2" > swap</ h4 >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > template< class... T>
void swap(variant< T...>& v, variant< T...>& w) noexcept( /*see below*/ );</ code ></ pre >
</ div >
</ div >
< div class = "ulist none" >
< ul class = "none" >
< li >
< p ></ p >
< div class = "dlist" >
< dl >
< dt class = "hdlist1" > Effects: </ dt >
< dd >
< p > Equivalent to < code > v.swap(w)</ code > .</ p >
</ dd >
</ dl >
</ div >
</ li >
</ ul >
</ div >
</ div >
< div class = "sect3" >
< h4 id = "ref_bad_variant_access" > bad_variant_access</ h4 >
< div class = "listingblock" >
< div class = "content" >
< pre class = "highlight" >< code > class bad_variant_access: public std::exception
{
public:
bad_variant_access() noexcept = default;
char const * what() const noexcept
{
return "bad_variant_access";
}
};</ code ></ pre >
</ div >
</ div >
</ div >
</ div >
</ div >
</ div >
< div class = "sect1" >
< h2 id = "copyright" > Copyright and License</ h2 >
< div class = "sectionbody" >
< div class = "paragraph" >
< p > This documentation is copyright 2018, 2019 Peter Dimov and is distributed under
the < a href = "http://www.boost.org/LICENSE_1_0.txt" > Boost Software License, Version 1.0</ a > .</ p >
</ div >
</ div >
</ div >
</ div >
< div id = "footer" >
< div id = "footer-text" >
2019-05-12 02:02:58 +03:00
Last updated 2019-05-12 00:15:41 +0300
2019-02-22 19:19:36 +02:00
</ div >
</ div >
< style >
* : not ( pre )> code { background : none ; color : #600000 ; }
2019-05-11 21:06:44 +03:00
: not ( pre ) : not ([ class ^= L ])> code { background : none ; color : #600000 ; }
2019-02-22 19:19:36 +02:00
</ style >
</ body >
</ html >