mp11.html 212 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <meta name="generator" content="Asciidoctor 1.5.8">
  8. <meta name="author" content="Peter Dimov">
  9. <title>Boost.Mp11: A C++11 metaprogramming library</title>
  10. <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">
  11. <style>
  12. /* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
  13. /* Uncomment @import statement below to use as custom stylesheet */
  14. /*@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";*/
  15. article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
  16. audio,canvas,video{display:inline-block}
  17. audio:not([controls]){display:none;height:0}
  18. script{display:none!important}
  19. html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
  20. a{background:transparent}
  21. a:focus{outline:thin dotted}
  22. a:active,a:hover{outline:0}
  23. h1{font-size:2em;margin:.67em 0}
  24. abbr[title]{border-bottom:1px dotted}
  25. b,strong{font-weight:bold}
  26. dfn{font-style:italic}
  27. hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
  28. mark{background:#ff0;color:#000}
  29. code,kbd,pre,samp{font-family:monospace;font-size:1em}
  30. pre{white-space:pre-wrap}
  31. q{quotes:"\201C" "\201D" "\2018" "\2019"}
  32. small{font-size:80%}
  33. sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
  34. sup{top:-.5em}
  35. sub{bottom:-.25em}
  36. img{border:0}
  37. svg:not(:root){overflow:hidden}
  38. figure{margin:0}
  39. fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
  40. legend{border:0;padding:0}
  41. button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
  42. button,input{line-height:normal}
  43. button,select{text-transform:none}
  44. button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
  45. button[disabled],html input[disabled]{cursor:default}
  46. input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
  47. button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
  48. textarea{overflow:auto;vertical-align:top}
  49. table{border-collapse:collapse;border-spacing:0}
  50. *,*::before,*::after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
  51. html,body{font-size:100%}
  52. 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}
  53. a:hover{cursor:pointer}
  54. img,object,embed{max-width:100%;height:auto}
  55. object,embed{height:100%}
  56. img{-ms-interpolation-mode:bicubic}
  57. .left{float:left!important}
  58. .right{float:right!important}
  59. .text-left{text-align:left!important}
  60. .text-right{text-align:right!important}
  61. .text-center{text-align:center!important}
  62. .text-justify{text-align:justify!important}
  63. .hide{display:none}
  64. img,object,svg{display:inline-block;vertical-align:middle}
  65. textarea{height:auto;min-height:50px}
  66. select{width:100%}
  67. .center{margin-left:auto;margin-right:auto}
  68. .stretch{width:100%}
  69. .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:.25em}
  70. 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}
  71. a{color:#2156a5;text-decoration:underline;line-height:inherit}
  72. a:hover,a:focus{color:#1d4b8f}
  73. a img{border:none}
  74. p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
  75. p aside{font-size:.875em;line-height:1.35;font-style:italic}
  76. 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:1em;margin-bottom:.5em;line-height:1.0125em}
  77. 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}
  78. h1{font-size:2.125em}
  79. h2{font-size:1.6875em}
  80. h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
  81. h4,h5{font-size:1.125em}
  82. h6{font-size:1em}
  83. hr{border:solid #dddddf;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
  84. em,i{font-style:italic;line-height:inherit}
  85. strong,b{font-weight:bold;line-height:inherit}
  86. small{font-size:60%;line-height:inherit}
  87. code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
  88. ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
  89. ul,ol{margin-left:1.5em}
  90. ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
  91. ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
  92. ul.square{list-style-type:square}
  93. ul.circle{list-style-type:circle}
  94. ul.disc{list-style-type:disc}
  95. ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
  96. dl dt{margin-bottom:.3125em;font-weight:bold}
  97. dl dd{margin-bottom:1.25em}
  98. abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
  99. abbr{text-transform:none}
  100. blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
  101. blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
  102. blockquote cite::before{content:"\2014 \0020"}
  103. blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
  104. blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
  105. @media screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
  106. h1{font-size:2.75em}
  107. h2{font-size:2.3125em}
  108. h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
  109. h4{font-size:1.4375em}}
  110. table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
  111. table thead,table tfoot{background:#f7f8f7}
  112. table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
  113. table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
  114. table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
  115. 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}
  116. h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
  117. h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
  118. .clearfix::before,.clearfix::after,.float-group::before,.float-group::after{content:" ";display:table}
  119. .clearfix::after,.float-group::after{clear:both}
  120. *:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word}
  121. *:not(pre)>code.nobreak{word-wrap:normal}
  122. *:not(pre)>code.nowrap{white-space:nowrap}
  123. pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
  124. em em{font-style:normal}
  125. strong strong{font-weight:400}
  126. .keyseq{color:rgba(51,51,51,.8)}
  127. kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
  128. .keyseq kbd:first-child{margin-left:0}
  129. .keyseq kbd:last-child{margin-right:0}
  130. .menuseq,.menuref{color:#000}
  131. .menuseq b:not(.caret),.menuref{font-weight:inherit}
  132. .menuseq{word-spacing:-.02em}
  133. .menuseq b.caret{font-size:1.25em;line-height:.8}
  134. .menuseq i.caret{font-weight:bold;text-align:center;width:.45em}
  135. b.button::before,b.button::after{position:relative;top:-1px;font-weight:400}
  136. b.button::before{content:"[";padding:0 3px 0 2px}
  137. b.button::after{content:"]";padding:0 2px 0 3px}
  138. p a>code:hover{color:rgba(0,0,0,.9)}
  139. #header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
  140. #header::before,#header::after,#content::before,#content::after,#footnotes::before,#footnotes::after,#footer::before,#footer::after{content:" ";display:table}
  141. #header::after,#content::after,#footnotes::after,#footer::after{clear:both}
  142. #content{margin-top:1.25em}
  143. #content::before{content:none}
  144. #header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
  145. #header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #dddddf}
  146. #header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #dddddf;padding-bottom:8px}
  147. #header .details{border-bottom:1px solid #dddddf;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;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}
  148. #header .details span:first-child{margin-left:-.125em}
  149. #header .details span.email a{color:rgba(0,0,0,.85)}
  150. #header .details br{display:none}
  151. #header .details br+span::before{content:"\00a0\2013\00a0"}
  152. #header .details br+span.author::before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
  153. #header .details br+span#revremark::before{content:"\00a0|\00a0"}
  154. #header #revnumber{text-transform:capitalize}
  155. #header #revnumber::after{content:"\00a0"}
  156. #content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #dddddf;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
  157. #toc{border-bottom:1px solid #e7e7e9;padding-bottom:.5em}
  158. #toc>ul{margin-left:.125em}
  159. #toc ul.sectlevel0>li>a{font-style:italic}
  160. #toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
  161. #toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
  162. #toc li{line-height:1.3334;margin-top:.3334em}
  163. #toc a{text-decoration:none}
  164. #toc a:active{text-decoration:underline}
  165. #toctitle{color:#7a2518;font-size:1.2em}
  166. @media screen and (min-width:768px){#toctitle{font-size:1.375em}
  167. body.toc2{padding-left:15em;padding-right:0}
  168. #toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #e7e7e9;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
  169. #toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
  170. #toc.toc2>ul{font-size:.9em;margin-bottom:0}
  171. #toc.toc2 ul ul{margin-left:0;padding-left:1em}
  172. #toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
  173. body.toc2.toc-right{padding-left:0;padding-right:15em}
  174. body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #e7e7e9;left:auto;right:0}}
  175. @media screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
  176. #toc.toc2{width:20em}
  177. #toc.toc2 #toctitle{font-size:1.375em}
  178. #toc.toc2>ul{font-size:.95em}
  179. #toc.toc2 ul ul{padding-left:1.25em}
  180. body.toc2.toc-right{padding-left:0;padding-right:20em}}
  181. #content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
  182. #content #toc>:first-child{margin-top:0}
  183. #content #toc>:last-child{margin-bottom:0}
  184. #footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
  185. #footer-text{color:rgba(255,255,255,.8);line-height:1.44}
  186. #content{margin-bottom:.625em}
  187. .sect1{padding-bottom:.625em}
  188. @media screen and (min-width:768px){#content{margin-bottom:1.25em}
  189. .sect1{padding-bottom:1.25em}}
  190. .sect1:last-child{padding-bottom:0}
  191. .sect1+.sect1{border-top:1px solid #e7e7e9}
  192. #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.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
  193. #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:.85em;display:block;padding-top:.1em}
  194. #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}
  195. #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}
  196. #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}
  197. .audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
  198. .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:1rem;font-style:italic}
  199. table.tableblock.fit-content>caption.title{white-space:nowrap;width:0}
  200. .paragraph.lead>p,#preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:1.21875em;line-height:1.6;color:rgba(0,0,0,.85)}
  201. table.tableblock #preamble>.sectionbody>[class="paragraph"]:first-of-type p{font-size:inherit}
  202. .admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
  203. .admonitionblock>table td.icon{text-align:center;width:80px}
  204. .admonitionblock>table td.icon img{max-width:none}
  205. .admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
  206. .admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #dddddf;color:rgba(0,0,0,.6)}
  207. .admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
  208. .exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
  209. .exampleblock>.content>:first-child{margin-top:0}
  210. .exampleblock>.content>:last-child{margin-bottom:0}
  211. .sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
  212. .sidebarblock>:first-child{margin-top:0}
  213. .sidebarblock>:last-child{margin-bottom:0}
  214. .sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
  215. .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}
  216. .literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
  217. .sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
  218. .literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;overflow-x:auto;padding:1em;font-size:.8125em}
  219. @media screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}
  220. @media screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}
  221. .literalblock pre.nowrap,.literalblock pre.nowrap pre,.listingblock pre.nowrap,.listingblock pre.nowrap pre{white-space:pre;word-wrap:normal}
  222. .literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
  223. .listingblock pre.highlightjs{padding:0}
  224. .listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
  225. .listingblock pre.prettyprint{border-width:0}
  226. .listingblock>.content{position:relative}
  227. .listingblock code[data-lang]::before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
  228. .listingblock:hover code[data-lang]::before{display:block}
  229. .listingblock.terminal pre .command::before{content:attr(data-prompt);padding-right:.5em;color:#999}
  230. .listingblock.terminal pre .command:not([data-prompt])::before{content:"$"}
  231. table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
  232. table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}
  233. table.pyhltable td.code{padding-left:.75em;padding-right:0}
  234. pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #dddddf}
  235. pre.pygments .lineno{display:inline-block;margin-right:.25em}
  236. table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
  237. .quoteblock{margin:0 1em 1.25em 1.5em;display:table}
  238. .quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
  239. .quoteblock blockquote,.quoteblock p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
  240. .quoteblock blockquote{margin:0;padding:0;border:0}
  241. .quoteblock blockquote::before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
  242. .quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
  243. .quoteblock .attribution{margin-top:.75em;margin-right:.5ex;text-align:right}
  244. .verseblock{margin:0 1em 1.25em}
  245. .verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
  246. .verseblock pre strong{font-weight:400}
  247. .verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
  248. .quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
  249. .quoteblock .attribution br,.verseblock .attribution br{display:none}
  250. .quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
  251. .quoteblock.abstract blockquote::before,.quoteblock.excerpt blockquote::before,.quoteblock .quoteblock blockquote::before{display:none}
  252. .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}
  253. .quoteblock.abstract{margin:0 1em 1.25em;display:block}
  254. .quoteblock.abstract>.title{margin:0 0 .375em;font-size:1.15em;text-align:center}
  255. .quoteblock.excerpt,.quoteblock .quoteblock{margin:0 0 1.25em;padding:0 0 .25em 1em;border-left:.25em solid #dddddf}
  256. .quoteblock.excerpt blockquote,.quoteblock.excerpt p,.quoteblock .quoteblock blockquote,.quoteblock .quoteblock p{color:inherit;font-size:1.0625rem}
  257. .quoteblock.excerpt .attribution,.quoteblock .quoteblock .attribution{color:inherit;text-align:left;margin-right:0}
  258. table.tableblock{max-width:100%;border-collapse:separate}
  259. p.tableblock:last-child{margin-bottom:0}
  260. td.tableblock>.content{margin-bottom:-1.25em}
  261. table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
  262. table.grid-all>thead>tr>.tableblock,table.grid-all>tbody>tr>.tableblock{border-width:0 1px 1px 0}
  263. table.grid-all>tfoot>tr>.tableblock{border-width:1px 1px 0 0}
  264. table.grid-cols>*>tr>.tableblock{border-width:0 1px 0 0}
  265. table.grid-rows>thead>tr>.tableblock,table.grid-rows>tbody>tr>.tableblock{border-width:0 0 1px}
  266. table.grid-rows>tfoot>tr>.tableblock{border-width:1px 0 0}
  267. table.grid-all>*>tr>.tableblock:last-child,table.grid-cols>*>tr>.tableblock:last-child{border-right-width:0}
  268. 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}
  269. table.frame-all{border-width:1px}
  270. table.frame-sides{border-width:0 1px}
  271. table.frame-topbot,table.frame-ends{border-width:1px 0}
  272. table.stripes-all tr,table.stripes-odd tr:nth-of-type(odd){background:#f8f8f7}
  273. table.stripes-none tr,table.stripes-odd tr:nth-of-type(even){background:none}
  274. th.halign-left,td.halign-left{text-align:left}
  275. th.halign-right,td.halign-right{text-align:right}
  276. th.halign-center,td.halign-center{text-align:center}
  277. th.valign-top,td.valign-top{vertical-align:top}
  278. th.valign-bottom,td.valign-bottom{vertical-align:bottom}
  279. th.valign-middle,td.valign-middle{vertical-align:middle}
  280. table thead th,table tfoot th{font-weight:bold}
  281. tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
  282. tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
  283. p.tableblock>code:only-child{background:none;padding:0}
  284. p.tableblock{font-size:1em}
  285. td>div.verse{white-space:pre}
  286. ol{margin-left:1.75em}
  287. ul li ol{margin-left:1.5em}
  288. dl dd{margin-left:1.125em}
  289. dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
  290. ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
  291. ul.checklist,ul.none,ol.none,ul.no-bullet,ol.no-bullet,ol.unnumbered,ul.unstyled,ol.unstyled{list-style-type:none}
  292. ul.no-bullet,ol.no-bullet,ol.unnumbered{margin-left:.625em}
  293. ul.unstyled,ol.unstyled{margin-left:0}
  294. ul.checklist{margin-left:.625em}
  295. 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.25em;font-size:.8em;position:relative;bottom:.125em}
  296. ul.checklist li>p:first-child>input[type="checkbox"]:first-child{margin-right:.25em}
  297. 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 .625em -1.25em}
  298. ul.inline>li{margin-left:1.25em}
  299. .unstyled dl dt{font-weight:400;font-style:normal}
  300. ol.arabic{list-style-type:decimal}
  301. ol.decimal{list-style-type:decimal-leading-zero}
  302. ol.loweralpha{list-style-type:lower-alpha}
  303. ol.upperalpha{list-style-type:upper-alpha}
  304. ol.lowerroman{list-style-type:lower-roman}
  305. ol.upperroman{list-style-type:upper-roman}
  306. ol.lowergreek{list-style-type:lower-greek}
  307. .hdlist>table,.colist>table{border:0;background:none}
  308. .hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
  309. td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
  310. td.hdlist1{font-weight:bold;padding-bottom:1.25em}
  311. .literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
  312. .colist td:not([class]):first-child{padding:.4em .75em 0;line-height:1;vertical-align:top}
  313. .colist td:not([class]):first-child img{max-width:none}
  314. .colist td:not([class]):last-child{padding:.25em 0}
  315. .thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
  316. .imageblock.left{margin:.25em .625em 1.25em 0}
  317. .imageblock.right{margin:.25em 0 1.25em .625em}
  318. .imageblock>.title{margin-bottom:0}
  319. .imageblock.thumb,.imageblock.th{border-width:6px}
  320. .imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
  321. .image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
  322. .image.left{margin-right:.625em}
  323. .image.right{margin-left:.625em}
  324. a.image{text-decoration:none;display:inline-block}
  325. a.image object{pointer-events:none}
  326. sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
  327. sup.footnote a,sup.footnoteref a{text-decoration:none}
  328. sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
  329. #footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
  330. #footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em;border-width:1px 0 0}
  331. #footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;margin-bottom:.2em}
  332. #footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none;margin-left:-1.05em}
  333. #footnotes .footnote:last-of-type{margin-bottom:0}
  334. #content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
  335. .gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
  336. .gist .file-data>table td.line-data{width:99%}
  337. div.unbreakable{page-break-inside:avoid}
  338. .big{font-size:larger}
  339. .small{font-size:smaller}
  340. .underline{text-decoration:underline}
  341. .overline{text-decoration:overline}
  342. .line-through{text-decoration:line-through}
  343. .aqua{color:#00bfbf}
  344. .aqua-background{background-color:#00fafa}
  345. .black{color:#000}
  346. .black-background{background-color:#000}
  347. .blue{color:#0000bf}
  348. .blue-background{background-color:#0000fa}
  349. .fuchsia{color:#bf00bf}
  350. .fuchsia-background{background-color:#fa00fa}
  351. .gray{color:#606060}
  352. .gray-background{background-color:#7d7d7d}
  353. .green{color:#006000}
  354. .green-background{background-color:#007d00}
  355. .lime{color:#00bf00}
  356. .lime-background{background-color:#00fa00}
  357. .maroon{color:#600000}
  358. .maroon-background{background-color:#7d0000}
  359. .navy{color:#000060}
  360. .navy-background{background-color:#00007d}
  361. .olive{color:#606000}
  362. .olive-background{background-color:#7d7d00}
  363. .purple{color:#600060}
  364. .purple-background{background-color:#7d007d}
  365. .red{color:#bf0000}
  366. .red-background{background-color:#fa0000}
  367. .silver{color:#909090}
  368. .silver-background{background-color:#bcbcbc}
  369. .teal{color:#006060}
  370. .teal-background{background-color:#007d7d}
  371. .white{color:#bfbfbf}
  372. .white-background{background-color:#fafafa}
  373. .yellow{color:#bfbf00}
  374. .yellow-background{background-color:#fafa00}
  375. span.icon>.fa{cursor:default}
  376. a span.icon>.fa{cursor:inherit}
  377. .admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
  378. .admonitionblock td.icon .icon-note::before{content:"\f05a";color:#19407c}
  379. .admonitionblock td.icon .icon-tip::before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
  380. .admonitionblock td.icon .icon-warning::before{content:"\f071";color:#bf6900}
  381. .admonitionblock td.icon .icon-caution::before{content:"\f06d";color:#bf3400}
  382. .admonitionblock td.icon .icon-important::before{content:"\f06a";color:#bf0000}
  383. .conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
  384. .conum[data-value] *{color:#fff!important}
  385. .conum[data-value]+b{display:none}
  386. .conum[data-value]::after{content:attr(data-value)}
  387. pre .conum[data-value]{position:relative;top:-.125em}
  388. b.conum *{color:inherit!important}
  389. .conum:not([data-value]):empty{display:none}
  390. dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
  391. h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
  392. p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
  393. p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
  394. p{margin-bottom:1.25rem}
  395. .sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
  396. .exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
  397. .print-only{display:none!important}
  398. @page{margin:1.25cm .75cm}
  399. @media print{*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
  400. html{font-size:80%}
  401. a{color:inherit!important;text-decoration:underline!important}
  402. a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
  403. a[href^="http:"]:not(.bare)::after,a[href^="https:"]:not(.bare)::after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
  404. abbr[title]::after{content:" (" attr(title) ")"}
  405. pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
  406. thead{display:table-header-group}
  407. svg{max-width:100%}
  408. p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
  409. h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
  410. #toc,.sidebarblock,.exampleblock>.content{background:none!important}
  411. #toc{border-bottom:1px solid #dddddf!important;padding-bottom:0!important}
  412. body.book #header{text-align:center}
  413. body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em}
  414. body.book #header .details{border:0!important;display:block;padding:0!important}
  415. body.book #header .details span:first-child{margin-left:0!important}
  416. body.book #header .details br{display:block}
  417. body.book #header .details br+span::before{content:none!important}
  418. body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
  419. body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
  420. .listingblock code[data-lang]::before{display:block}
  421. #footer{padding:0 .9375em}
  422. .hide-on-print{display:none!important}
  423. .print-only{display:block!important}
  424. .hide-for-print{display:none!important}
  425. .show-for-print{display:inherit!important}}
  426. @media print,amzn-kf8{#header>h1:first-child{margin-top:1.25rem}
  427. .sect1{padding:0!important}
  428. .sect1+.sect1{border:0}
  429. #footer{background:none}
  430. #footer-text{color:rgba(0,0,0,.6);font-size:.9em}}
  431. @media amzn-kf8{#header,#content,#footnotes,#footer{padding:0}}
  432. </style>
  433. </head>
  434. <body class="article toc2 toc-left">
  435. <div id="header">
  436. <h1>Boost.Mp11: A C++11 metaprogramming library</h1>
  437. <div class="details">
  438. <span id="author" class="author">Peter Dimov</span><br>
  439. </div>
  440. <div id="toc" class="toc2">
  441. <div id="toctitle">Table of Contents</div>
  442. <ul class="sectlevel1">
  443. <li><a href="#overview">Overview</a></li>
  444. <li><a href="#definitions">Definitions</a></li>
  445. <li><a href="#examples">Examples</a>
  446. <ul class="sectlevel2">
  447. <li><a href="#generating_test_cases">Generating Test Cases</a></li>
  448. <li><a href="#writing_common_type_specializations">Writing common_type Specializations</a></li>
  449. <li><a href="#fixing_tuple_cat">Fixing tuple_cat</a></li>
  450. <li><a href="#computing_return_types">Computing Return Types</a></li>
  451. </ul>
  452. </li>
  453. <li><a href="#changelog">Revision History</a>
  454. <ul class="sectlevel2">
  455. <li><a href="#changes_in_1_70_0">Changes in 1.70.0</a></li>
  456. <li><a href="#changes_in_1_69_0">Changes in 1.69.0</a></li>
  457. </ul>
  458. </li>
  459. <li><a href="#reference">Reference</a>
  460. <ul class="sectlevel2">
  461. <li><a href="#integral">Integral Constants, &lt;boost/mp11/integral.hpp&gt;</a>
  462. <ul class="sectlevel3">
  463. <li><a href="#mp_boolb">mp_bool&lt;B&gt;</a></li>
  464. <li><a href="#mp_true">mp_true</a></li>
  465. <li><a href="#mp_false">mp_false</a></li>
  466. <li><a href="#mp_to_boolt">mp_to_bool&lt;T&gt;</a></li>
  467. <li><a href="#mp_nott">mp_not&lt;T&gt;</a></li>
  468. <li><a href="#mp_inti">mp_int&lt;I&gt;</a></li>
  469. <li><a href="#mp_size_tn">mp_size_t&lt;N&gt;</a></li>
  470. </ul>
  471. </li>
  472. <li><a href="#list">List Operations, &lt;boost/mp11/list.hpp&gt;</a>
  473. <ul class="sectlevel3">
  474. <li><a href="#mp_listt">mp_list&lt;T&#8230;&#8203;&gt;</a></li>
  475. <li><a href="#mp_list_ct_i">mp_list_c&lt;T, I&#8230;&#8203;&gt;</a></li>
  476. <li><a href="#mp_is_listl">mp_is_list&lt;L&gt;</a></li>
  477. <li><a href="#mp_sizel">mp_size&lt;L&gt;</a></li>
  478. <li><a href="#mp_emptyl">mp_empty&lt;L&gt;</a></li>
  479. <li><a href="#mp_assignl1_l2">mp_assign&lt;L1, L2&gt;</a></li>
  480. <li><a href="#mp_clearl">mp_clear&lt;L&gt;</a></li>
  481. <li><a href="#mp_frontl">mp_front&lt;L&gt;</a></li>
  482. <li><a href="#mp_pop_frontl">mp_pop_front&lt;L&gt;</a></li>
  483. <li><a href="#mp_firstl">mp_first&lt;L&gt;</a></li>
  484. <li><a href="#mp_restl">mp_rest&lt;L&gt;</a></li>
  485. <li><a href="#mp_secondl">mp_second&lt;L&gt;</a></li>
  486. <li><a href="#mp_thirdl">mp_third&lt;L&gt;</a></li>
  487. <li><a href="#mp_push_frontl_t">mp_push_front&lt;L, T&#8230;&#8203;&gt;</a></li>
  488. <li><a href="#mp_push_backl_t">mp_push_back&lt;L, T&#8230;&#8203;&gt;</a></li>
  489. <li><a href="#mp_renamel_y">mp_rename&lt;L, Y&gt;</a></li>
  490. <li><a href="#mp_applyf_l">mp_apply&lt;F, L&gt;</a></li>
  491. <li><a href="#mp_apply_qq_l">mp_apply_q&lt;Q, L&gt;</a></li>
  492. <li><a href="#mp_appendl">mp_append&lt;L&#8230;&#8203;&gt;</a></li>
  493. <li><a href="#mp_replace_frontl_t">mp_replace_front&lt;L, T&gt;</a></li>
  494. <li><a href="#mp_replace_firstl_t">mp_replace_first&lt;L, T&gt;</a></li>
  495. <li><a href="#mp_replace_secondl_t">mp_replace_second&lt;L, T&gt;</a></li>
  496. <li><a href="#mp_replace_thirdl_t">mp_replace_third&lt;L, T&gt;</a></li>
  497. <li><a href="#mp_transform_frontl_f">mp_transform_front&lt;L, F&gt;</a></li>
  498. <li><a href="#mp_transform_front_ql_q">mp_transform_front_q&lt;L, Q&gt;</a></li>
  499. <li><a href="#mp_transform_firstl_f">mp_transform_first&lt;L, F&gt;</a></li>
  500. <li><a href="#mp_transform_first_ql_q">mp_transform_first_q&lt;L, Q&gt;</a></li>
  501. <li><a href="#mp_transform_secondl_f">mp_transform_second&lt;L, F&gt;</a></li>
  502. <li><a href="#mp_transform_second_ql_q">mp_transform_second_q&lt;L, Q&gt;</a></li>
  503. <li><a href="#mp_transform_thirdl_f">mp_transform_third&lt;L, F&gt;</a></li>
  504. <li><a href="#mp_transform_third_ql_q">mp_transform_third_q&lt;L, Q&gt;</a></li>
  505. </ul>
  506. </li>
  507. <li><a href="#utility">Utility Components, &lt;boost/mp11/utility.hpp&gt;</a>
  508. <ul class="sectlevel3">
  509. <li><a href="#mp_identityt">mp_identity&lt;T&gt;</a></li>
  510. <li><a href="#mp_identity_tt">mp_identity_t&lt;T&gt;</a></li>
  511. <li><a href="#mp_inheritt">mp_inherit&lt;T&#8230;&#8203;&gt;</a></li>
  512. <li><a href="#mp_if_cc_t_e">mp_if_c&lt;C, T, E&#8230;&#8203;&gt;</a></li>
  513. <li><a href="#mp_ifc_t_e">mp_if&lt;C, T, E&#8230;&#8203;&gt;</a></li>
  514. <li><a href="#mp_eval_if_cc_t_f_u">mp_eval_if_c&lt;C, T, F, U&#8230;&#8203;&gt;</a></li>
  515. <li><a href="#mp_eval_ifc_t_f_u">mp_eval_if&lt;C, T, F, U&#8230;&#8203;&gt;</a></li>
  516. <li><a href="#mp_eval_if_qc_t_q_u">mp_eval_if_q&lt;C, T, Q, U&#8230;&#8203;&gt;</a></li>
  517. <li><a href="#mp_eval_if_notc_t_f_u">mp_eval_if_not&lt;C, T, F, U&#8230;&#8203;&gt;</a></li>
  518. <li><a href="#mp_eval_if_not_qc_t_q_u">mp_eval_if_not_q&lt;C, T, Q, U&#8230;&#8203;&gt;</a></li>
  519. <li><a href="#mp_validf_t">mp_valid&lt;F, T&#8230;&#8203;&gt;</a></li>
  520. <li><a href="#mp_valid_qq_t">mp_valid_q&lt;Q, T&#8230;&#8203;&gt;</a></li>
  521. <li><a href="#mp_eval_ort_f_u">mp_eval_or&lt;T, F, U&#8230;&#8203;&gt;</a></li>
  522. <li><a href="#mp_eval_or_qt_q_u">mp_eval_or_q&lt;T, Q, U&#8230;&#8203;&gt;</a></li>
  523. <li><a href="#mp_condc_t_r">mp_cond&lt;C, T, R&#8230;&#8203;&gt;</a></li>
  524. <li><a href="#mp_deferf_t">mp_defer&lt;F, T&#8230;&#8203;&gt;</a></li>
  525. <li><a href="#mp_quotef">mp_quote&lt;F&gt;</a></li>
  526. <li><a href="#mp_quote_traitf">mp_quote_trait&lt;F&gt;</a></li>
  527. <li><a href="#mp_invoke_qq_t">mp_invoke_q&lt;Q, T&#8230;&#8203;&gt;</a></li>
  528. <li><a href="#mp_not_fnp">mp_not_fn&lt;P&gt;</a></li>
  529. <li><a href="#mp_not_fn_qq">mp_not_fn_q&lt;Q&gt;</a></li>
  530. </ul>
  531. </li>
  532. <li><a href="#algorithm">Algorithms, &lt;boost/mp11/algorithm.hpp&gt;</a>
  533. <ul class="sectlevel3">
  534. <li><a href="#mp_transformf_l">mp_transform&lt;F, L&#8230;&#8203;&gt;</a></li>
  535. <li><a href="#mp_transform_qq_l">mp_transform_q&lt;Q, L&#8230;&#8203;&gt;</a></li>
  536. <li><a href="#mp_transform_ifp_f_l">mp_transform_if&lt;P, F, L&#8230;&#8203;&gt;</a></li>
  537. <li><a href="#mp_transform_if_qqp_qf_l">mp_transform_if_q&lt;Qp, Qf, L&#8230;&#8203;&gt;</a></li>
  538. <li><a href="#mp_filterp_l">mp_filter&lt;P, L&#8230;&#8203;&gt;</a></li>
  539. <li><a href="#mp_filter_qqp_l">mp_filter_q&lt;Qp, L&#8230;&#8203;&gt;</a></li>
  540. <li><a href="#mp_filll_v">mp_fill&lt;L, V&gt;</a></li>
  541. <li><a href="#mp_countl_v">mp_count&lt;L, V&gt;</a></li>
  542. <li><a href="#mp_count_ifl_p">mp_count_if&lt;L, P&gt;</a></li>
  543. <li><a href="#mp_count_if_ql_q">mp_count_if_q&lt;L, Q&gt;</a></li>
  544. <li><a href="#mp_containsl_v">mp_contains&lt;L, V&gt;</a></li>
  545. <li><a href="#mp_starts_withl1_l2">mp_starts_with&lt;L1, L2&gt;</a></li>
  546. <li><a href="#mp_repeat_cl_n">mp_repeat_c&lt;L, N&gt;</a></li>
  547. <li><a href="#mp_repeatl_n">mp_repeat&lt;L, N&gt;</a></li>
  548. <li><a href="#mp_productf_l">mp_product&lt;F, L&#8230;&#8203;&gt;</a></li>
  549. <li><a href="#mp_product_qq_l">mp_product_q&lt;Q, L&#8230;&#8203;&gt;</a></li>
  550. <li><a href="#mp_drop_cl_n">mp_drop_c&lt;L, N&gt;</a></li>
  551. <li><a href="#mp_dropl_n">mp_drop&lt;L, N&gt;</a></li>
  552. <li><a href="#mp_from_sequences">mp_from_sequence&lt;S&gt;</a></li>
  553. <li><a href="#mp_iota_cn">mp_iota_c&lt;N&gt;</a></li>
  554. <li><a href="#mp_iotan">mp_iota&lt;N&gt;</a></li>
  555. <li><a href="#mp_at_cl_i">mp_at_c&lt;L, I&gt;</a></li>
  556. <li><a href="#mp_atl_i">mp_at&lt;L, I&gt;</a></li>
  557. <li><a href="#mp_take_cl_n">mp_take_c&lt;L, N&gt;</a></li>
  558. <li><a href="#mp_takel_n">mp_take&lt;L, N&gt;</a></li>
  559. <li><a href="#mp_backl">mp_back&lt;L&gt;</a></li>
  560. <li><a href="#mp_pop_backl">mp_pop_back&lt;L&gt;</a></li>
  561. <li><a href="#mp_insert_cl_i_t">mp_insert_c&lt;L, I, T&#8230;&#8203;&gt;</a></li>
  562. <li><a href="#mp_insertl_i_t">mp_insert&lt;L, I, T&#8230;&#8203;&gt;</a></li>
  563. <li><a href="#mp_erase_cl_i_j">mp_erase_c&lt;L, I, J&gt;</a></li>
  564. <li><a href="#mp_erasel_i_j">mp_erase&lt;L, I, J&gt;</a></li>
  565. <li><a href="#mp_replacel_v_w">mp_replace&lt;L, V, W&gt;</a></li>
  566. <li><a href="#mp_replace_ifl_p_w">mp_replace_if&lt;L, P, W&gt;</a></li>
  567. <li><a href="#mp_replace_if_ql_q_w">mp_replace_if_q&lt;L, Q, W&gt;</a></li>
  568. <li><a href="#mp_replace_at_cl_i_w">mp_replace_at_c&lt;L, I, W&gt;</a></li>
  569. <li><a href="#mp_replace_atl_i_w">mp_replace_at&lt;L, I, W&gt;</a></li>
  570. <li><a href="#mp_copy_ifl_p">mp_copy_if&lt;L, P&gt;</a></li>
  571. <li><a href="#mp_copy_if_ql_q">mp_copy_if_q&lt;L, Q&gt;</a></li>
  572. <li><a href="#mp_removel_v">mp_remove&lt;L, V&gt;</a></li>
  573. <li><a href="#mp_remove_ifl_p">mp_remove_if&lt;L, P&gt;</a></li>
  574. <li><a href="#mp_remove_if_ql_q">mp_remove_if_q&lt;L, Q&gt;</a></li>
  575. <li><a href="#mp_partitionl_p">mp_partition&lt;L, P&gt;</a></li>
  576. <li><a href="#mp_partition_ql_q">mp_partition_q&lt;L, Q&gt;</a></li>
  577. <li><a href="#mp_sortl_p">mp_sort&lt;L, P&gt;</a></li>
  578. <li><a href="#mp_sort_ql_q">mp_sort_q&lt;L, Q&gt;</a></li>
  579. <li><a href="#mp_nth_element_cl_i_p">mp_nth_element_c&lt;L, I, P&gt;</a></li>
  580. <li><a href="#mp_nth_elementl_i_p">mp_nth_element&lt;L, I, P&gt;</a></li>
  581. <li><a href="#mp_nth_element_ql_i_q">mp_nth_element_q&lt;L, I, Q&gt;</a></li>
  582. <li><a href="#mp_min_elementl_p">mp_min_element&lt;L, P&gt;</a></li>
  583. <li><a href="#mp_min_element_ql_q">mp_min_element_q&lt;L, Q&gt;</a></li>
  584. <li><a href="#mp_max_elementl_p">mp_max_element&lt;L, P&gt;</a></li>
  585. <li><a href="#mp_max_element_ql_q">mp_max_element_q&lt;L, Q&gt;</a></li>
  586. <li><a href="#mp_findl_v">mp_find&lt;L, V&gt;</a></li>
  587. <li><a href="#mp_find_ifl_p">mp_find_if&lt;L, P&gt;</a></li>
  588. <li><a href="#mp_find_if_ql_q">mp_find_if_q&lt;L, Q&gt;</a></li>
  589. <li><a href="#mp_reversel">mp_reverse&lt;L&gt;</a></li>
  590. <li><a href="#mp_foldl_v_f">mp_fold&lt;L, V, F&gt;</a></li>
  591. <li><a href="#mp_fold_ql_v_q">mp_fold_q&lt;L, V, Q&gt;</a></li>
  592. <li><a href="#mp_reverse_foldl_v_f">mp_reverse_fold&lt;L, V, F&gt;</a></li>
  593. <li><a href="#mp_reverse_fold_ql_v_q">mp_reverse_fold_q&lt;L, V, Q&gt;</a></li>
  594. <li><a href="#mp_uniquel">mp_unique&lt;L&gt;</a></li>
  595. <li><a href="#mp_all_ofl_p">mp_all_of&lt;L, P&gt;</a></li>
  596. <li><a href="#mp_all_of_ql_q">mp_all_of_q&lt;L, Q&gt;</a></li>
  597. <li><a href="#mp_none_ofl_p">mp_none_of&lt;L, P&gt;</a></li>
  598. <li><a href="#mp_none_of_ql_q">mp_none_of_q&lt;L, Q&gt;</a></li>
  599. <li><a href="#mp_any_ofl_p">mp_any_of&lt;L, P&gt;</a></li>
  600. <li><a href="#mp_any_of_ql_q">mp_any_of_q&lt;L, Q&gt;</a></li>
  601. <li><a href="#mp_for_eachlf">mp_for_each&lt;L&gt;(f)</a></li>
  602. <li><a href="#mp_with_indexni_f">mp_with_index&lt;N&gt;(i, f)</a></li>
  603. </ul>
  604. </li>
  605. <li><a href="#set">Set Operations, &lt;boost/mp11/set.hpp&gt;</a>
  606. <ul class="sectlevel3">
  607. <li><a href="#mp_is_sets">mp_is_set&lt;S&gt;</a></li>
  608. <li><a href="#mp_set_containss_v">mp_set_contains&lt;S, V&gt;</a></li>
  609. <li><a href="#mp_set_push_backs_t">mp_set_push_back&lt;S, T&#8230;&#8203;&gt;</a></li>
  610. <li><a href="#mp_set_push_fronts_t">mp_set_push_front&lt;S, T&#8230;&#8203;&gt;</a></li>
  611. <li><a href="#mp_set_unionl">mp_set_union&lt;L&#8230;&#8203;&gt;</a></li>
  612. <li><a href="#mp_set_intersections">mp_set_intersection&lt;S&#8230;&#8203;&gt;</a></li>
  613. <li><a href="#mp_set_differencel_s">mp_set_difference&lt;L, S&#8230;&#8203;&gt;</a></li>
  614. </ul>
  615. </li>
  616. <li><a href="#map">Map Operations, &lt;boost/mp11/map.hpp&gt;</a>
  617. <ul class="sectlevel3">
  618. <li><a href="#mp_is_mapm">mp_is_map&lt;M&gt;</a></li>
  619. <li><a href="#mp_map_findm_k">mp_map_find&lt;M, K&gt;</a></li>
  620. <li><a href="#mp_map_containsm_k">mp_map_contains&lt;M, K&gt;</a></li>
  621. <li><a href="#mp_map_insertm_t">mp_map_insert&lt;M, T&gt;</a></li>
  622. <li><a href="#mp_map_replacem_t">mp_map_replace&lt;M, T&gt;</a></li>
  623. <li><a href="#mp_map_updatem_t_f">mp_map_update&lt;M, T, F&gt;</a></li>
  624. <li><a href="#mp_map_update_qm_t_q">mp_map_update_q&lt;M, T, Q&gt;</a></li>
  625. <li><a href="#mp_map_erasem_k">mp_map_erase&lt;M, K&gt;</a></li>
  626. <li><a href="#mp_map_keysm">mp_map_keys&lt;M&gt;</a></li>
  627. </ul>
  628. </li>
  629. <li><a href="#function">Helper Metafunctions, &lt;boost/mp11/function.hpp&gt;</a>
  630. <ul class="sectlevel3">
  631. <li><a href="#mp_voidt">mp_void&lt;T&#8230;&#8203;&gt;</a></li>
  632. <li><a href="#mp_andt">mp_and&lt;T&#8230;&#8203;&gt;</a></li>
  633. <li><a href="#mp_allt">mp_all&lt;T&#8230;&#8203;&gt;</a></li>
  634. <li><a href="#mp_ort">mp_or&lt;T&#8230;&#8203;&gt;</a></li>
  635. <li><a href="#mp_anyt">mp_any&lt;T&#8230;&#8203;&gt;</a></li>
  636. <li><a href="#mp_samet">mp_same&lt;T&#8230;&#8203;&gt;</a></li>
  637. <li><a href="#mp_similart">mp_similar&lt;T&#8230;&#8203;&gt;</a></li>
  638. <li><a href="#mp_plust">mp_plus&lt;T&#8230;&#8203;&gt;</a></li>
  639. <li><a href="#mp_lesst1_t2">mp_less&lt;T1, T2&gt;</a></li>
  640. <li><a href="#mp_mint1_t">mp_min&lt;T1, T&#8230;&#8203;&gt;</a></li>
  641. <li><a href="#mp_maxt1_t">mp_max&lt;T1, T&#8230;&#8203;&gt;</a></li>
  642. </ul>
  643. </li>
  644. <li><a href="#bind">Bind, &lt;boost/mp11/bind.hpp&gt;</a>
  645. <ul class="sectlevel3">
  646. <li><a href="#mp_argi">mp_arg&lt;I&gt;</a></li>
  647. <li><a href="#1_9">_1, &#8230;&#8203;, _9</a></li>
  648. <li><a href="#mp_bindf_t">mp_bind&lt;F, T&#8230;&#8203;&gt;</a></li>
  649. <li><a href="#mp_bind_qq_t">mp_bind_q&lt;Q, T&#8230;&#8203;&gt;</a></li>
  650. <li><a href="#mp_bind_frontf_t">mp_bind_front&lt;F, T&#8230;&#8203;&gt;</a></li>
  651. <li><a href="#mp_bind_front_qq_t">mp_bind_front_q&lt;Q, T&#8230;&#8203;&gt;</a></li>
  652. <li><a href="#mp_bind_backf_t">mp_bind_back&lt;F, T&#8230;&#8203;&gt;</a></li>
  653. <li><a href="#mp_bind_back_qq_t">mp_bind_back_q&lt;Q, T&#8230;&#8203;&gt;</a></li>
  654. </ul>
  655. </li>
  656. <li><a href="#integer_sequence">Integer Sequences, &lt;boost/mp11/integer_sequence.hpp&gt;</a>
  657. <ul class="sectlevel3">
  658. <li><a href="#integer_sequencet_i">integer_sequence&lt;T, I&#8230;&#8203;&gt;</a></li>
  659. <li><a href="#make_integer_sequencet_n">make_integer_sequence&lt;T, N&gt;</a></li>
  660. <li><a href="#index_sequencei">index_sequence&lt;I&#8230;&#8203;&gt;</a></li>
  661. <li><a href="#make_index_sequencen">make_index_sequence&lt;N&gt;</a></li>
  662. <li><a href="#index_sequence_fort">index_sequence_for&lt;T&#8230;&#8203;&gt;</a></li>
  663. </ul>
  664. </li>
  665. <li><a href="#tuple">Tuple Operations, &lt;boost/mp11/tuple.hpp&gt;</a>
  666. <ul class="sectlevel3">
  667. <li><a href="#tuple_applyf_tp">tuple_apply(f, tp)</a></li>
  668. <li><a href="#construct_from_tuplettp">construct_from_tuple&lt;T&gt;(tp)</a></li>
  669. <li><a href="#tuple_for_eachtp_f">tuple_for_each(tp, f)</a></li>
  670. </ul>
  671. </li>
  672. <li><a href="#mp11">Convenience Header, &lt;boost/mp11.hpp&gt;</a></li>
  673. <li><a href="#mpl">MPL Support, &lt;boost/mp11/mpl.hpp&gt;</a></li>
  674. </ul>
  675. </li>
  676. <li><a href="#copyright_license_and_acknowledgments">Appendix A: Copyright, License, and Acknowledgments</a></li>
  677. </ul>
  678. </div>
  679. </div>
  680. <div id="content">
  681. <div class="sect1">
  682. <h2 id="overview">Overview</h2>
  683. <div class="sectionbody">
  684. <div class="paragraph">
  685. <p>Mp11 is a C++11 metaprogramming library for compile-time manipulation of data structures
  686. that contain types. It&#8217;s based on template aliases and variadic templates and implements the
  687. approach outlined in the article
  688. <a href="simple_cxx11_metaprogramming.html">"Simple C&#43;&#43; metaprogramming"</a>
  689. and <a href="simple_cxx11_metaprogramming_2.html">its sequel</a>. Reading these
  690. articles before proceeding with this documentation is <em>highly</em> recommended.</p>
  691. </div>
  692. <div class="paragraph">
  693. <p>The general principles upon which Mp11 is built are that algorithms and metafunctions are
  694. template aliases of the form <code>F&lt;T&#8230;&#8203;&gt;</code> and data structures are lists of the form <code>L&lt;T&#8230;&#8203;&gt;</code>,
  695. with the library placing no requirements on <code>L</code>. <code>mp_list&lt;T&#8230;&#8203;&gt;</code> is the built-in list type,
  696. but <code>std::tuple&lt;T&#8230;&#8203;&gt;</code>, <code>std::pair&lt;T1, T2&gt;</code> and <code>std::variant&lt;T&#8230;&#8203;&gt;</code> are also perfectly
  697. legitimate list types, although of course <code>std::pair&lt;T1, T2&gt;</code>, due to having exactly two elements,
  698. is not resizeable and will consequently not work with algorithms that need to add or remove
  699. elements.</p>
  700. </div>
  701. <div class="paragraph">
  702. <p>Another distinguishing feature of this approach is that lists (<code>L&lt;T&#8230;&#8203;&gt;</code>) have the same form as
  703. metafunctions (<code>F&lt;T&#8230;&#8203;&gt;</code>) and can therefore be used as such. For example, applying <code>std::add_pointer_t</code>
  704. to the list <code>std::tuple&lt;int, float&gt;</code> by way of <code>mp_transform&lt;std::add_pointer_t, std::tuple&lt;int, float&gt;&gt;</code>
  705. gives us <code>std::tuple&lt;int*, float*&gt;</code>, but we can also apply <code>mp_list</code> to the same tuple:</p>
  706. </div>
  707. <div class="literalblock">
  708. <div class="content">
  709. <pre>using R = mp_transform&lt;mp_list, std::tuple&lt;int, float&gt;&gt;;</pre>
  710. </div>
  711. </div>
  712. <div class="paragraph">
  713. <p>and get <code>std::tuple&lt;mp_list&lt;int&gt;, mp_list&lt;float&gt;&gt;</code>.</p>
  714. </div>
  715. </div>
  716. </div>
  717. <div class="sect1">
  718. <h2 id="definitions">Definitions</h2>
  719. <div class="sectionbody">
  720. <div class="paragraph">
  721. <p>A <em>list</em> is a&#8201;&#8212;&#8201;usually but not necessarily variadic&#8201;&#8212;&#8201;template class whose parameters are all types,
  722. for example <code>mp_list&lt;char[], void&gt;</code>, <code>mp_list&lt;&gt;</code>, <code>std::tuple&lt;int, float, char&gt;</code>, <code>std::pair&lt;int, float&gt;</code>, <code>std::shared_ptr&lt;X&gt;</code>.</p>
  723. </div>
  724. <div class="paragraph">
  725. <p>A <em>metafunction</em> is a class template or a template alias whose parameters are all types, for example <code>std::add_pointer_t</code>,
  726. <code>std::is_const</code>, <code>mp_second</code>, <code>mp_push_front</code>, <code>mp_list</code>, <code>std::tuple</code>, <code>std::pair</code>, <code>std::shared_ptr</code>, or</p>
  727. </div>
  728. <div class="listingblock">
  729. <div class="content">
  730. <pre class="highlight"><code>template&lt;class...&gt; using F1 = void;
  731. template&lt;class T&gt; using F2 = T*;
  732. template&lt;class... T&gt; using F3 = std::integral_constant&lt;std::size_t, sizeof...(T)&gt;;</code></pre>
  733. </div>
  734. </div>
  735. <div class="paragraph">
  736. <p>A <em>quoted metafunction</em> is a class with a public metafunction member called <code>fn</code>, for example</p>
  737. </div>
  738. <div class="listingblock">
  739. <div class="content">
  740. <pre class="highlight"><code>struct Q1 { template&lt;class...&gt; using fn = void; };
  741. struct Q2 { template&lt;class T&gt; using fn = T*; };
  742. struct Q3 { template&lt;class... T&gt; using fn =
  743. std::integral_constant&lt;std::size_t, sizeof...(T)&gt;; };</code></pre>
  744. </div>
  745. </div>
  746. <div class="paragraph">
  747. <p>An <em>integral constant type</em> is a class with a public member <code>value</code> that is an integral constant in the C++ sense. For example,
  748. <code>std::integral_constant&lt;int, 7&gt;</code>, or</p>
  749. </div>
  750. <div class="literalblock">
  751. <div class="content">
  752. <pre>struct N { static int constexpr value = 2; };</pre>
  753. </div>
  754. </div>
  755. <div class="paragraph">
  756. <p>A <em>set</em> is a list whose elements are unique.</p>
  757. </div>
  758. <div class="paragraph">
  759. <p>A <em>map</em> is a list of lists, the inner lists having at least one element (the key.) The keys of the map must be unique. For example,</p>
  760. </div>
  761. <div class="listingblock">
  762. <div class="content">
  763. <pre class="highlight"><code>using M1 = std::tuple&lt;std::pair&lt;int, int*&gt;, std::pair&lt;float, float*&gt;,
  764. std::pair&lt;void, void*&gt;&gt;;
  765. using M2 = mp_list&lt;mp_list&lt;int, int*&gt;, mp_list&lt;float&gt;,
  766. mp_list&lt;char, char[1], char[2]&gt;&gt;;</code></pre>
  767. </div>
  768. </div>
  769. </div>
  770. </div>
  771. <div class="sect1">
  772. <h2 id="examples">Examples</h2>
  773. <div class="sectionbody">
  774. <div class="sect2">
  775. <h3 id="generating_test_cases">Generating Test Cases</h3>
  776. <div class="paragraph">
  777. <p>Let&#8217;s suppose that we have written a metafunction <code>result&lt;T, U&gt;</code>:</p>
  778. </div>
  779. <div class="listingblock">
  780. <div class="content">
  781. <pre class="highlight"><code>template&lt;class T&gt; using promote = typename std::common_type&lt;T, int&gt;::type;
  782. template&lt;class T, class U&gt; using result =
  783. typename std::common_type&lt;promote&lt;T&gt;, promote&lt;U&gt;&gt;::type;</code></pre>
  784. </div>
  785. </div>
  786. <div class="paragraph">
  787. <p>that ought to represent the result of an arithmetic operation on the integer types <code>T</code> and <code>U</code>,
  788. for example <code>t + u</code>. We want to test whether <code>result&lt;T, U&gt;</code> gives correct results for various combinations
  789. of <code>T</code> and <code>U</code>, so we write the function</p>
  790. </div>
  791. <div class="listingblock">
  792. <div class="content">
  793. <pre class="highlight"><code>template&lt;class T1, class T2&gt; void test_result()
  794. {
  795. using T3 = decltype( T1() + T2() );
  796. using T4 = result&lt;T1, T2&gt;;
  797. std::cout &lt;&lt; ( std::is_same&lt;T3, T4&gt;::value? "[PASS]": "[FAIL]" ) &lt;&lt; std::endl;
  798. }</code></pre>
  799. </div>
  800. </div>
  801. <div class="paragraph">
  802. <p>and then need to call it a substantial number of times:</p>
  803. </div>
  804. <div class="literalblock">
  805. <div class="content">
  806. <pre>int main()
  807. {
  808. test_result&lt;char, char&gt;();
  809. test_result&lt;char, short&gt;();
  810. test_result&lt;char, int&gt;();
  811. test_result&lt;char, unsigned&gt;();
  812. // ...
  813. }</pre>
  814. </div>
  815. </div>
  816. <div class="paragraph">
  817. <p>Writing all those type combinations by hand is unwieldy, error prone, and worst of all, boring. This is
  818. how we can leverage Mp11 to automate the task:</p>
  819. </div>
  820. <div class="listingblock">
  821. <div class="content">
  822. <pre class="highlight"><code>#include &lt;boost/mp11.hpp&gt;
  823. #include &lt;boost/core/demangle.hpp&gt;
  824. #include &lt;type_traits&gt;
  825. #include &lt;iostream&gt;
  826. #include &lt;typeinfo&gt;
  827. using namespace boost::mp11;
  828. template&lt;class T&gt; std::string name()
  829. {
  830. return boost::core::demangle( typeid(T).name() );
  831. }
  832. template&lt;class T&gt; using promote = typename std::common_type&lt;T, int&gt;::type;
  833. template&lt;class T, class U&gt; using result =
  834. typename std::common_type&lt;promote&lt;T&gt;, promote&lt;U&gt;&gt;::type;
  835. template&lt;class T1, class T2&gt; void test_result( mp_list&lt;T1, T2&gt; const&amp; )
  836. {
  837. using T3 = decltype( T1() + T2() );
  838. using T4 = result&lt;T1, T2&gt;;
  839. std::cout &lt;&lt; ( std::is_same&lt;T3, T4&gt;::value? "[PASS] ": "[FAIL] " )
  840. &lt;&lt; name&lt;T1&gt;() &lt;&lt; " + " &lt;&lt; name&lt;T2&gt;() &lt;&lt; " -&gt; " &lt;&lt; name&lt;T3&gt;()
  841. &lt;&lt; ", result: " &lt;&lt; name&lt;T4&gt;() &lt;&lt; std::endl;
  842. }
  843. int main()
  844. {
  845. using L = std::tuple&lt;char, short, int, unsigned, long, unsigned long&gt;;
  846. tuple_for_each( mp_product&lt;mp_list, L, L&gt;(), [](auto&amp;&amp; x){ test_result(x); } );
  847. }</code></pre>
  848. </div>
  849. </div>
  850. <div class="paragraph">
  851. <p>How does it work?</p>
  852. </div>
  853. <div class="paragraph">
  854. <p><code>mp_product&lt;F, L1, L2&gt;</code> calls <code>F&lt;T1, T2&gt;</code> where <code>T1</code> varies over the elements of <code>L1</code> and <code>T2</code> varies over
  855. the elements of <code>L2</code>, as if by executing two nested loops. It then returns a list of these results, of the same
  856. type as <code>L1</code>.</p>
  857. </div>
  858. <div class="paragraph">
  859. <p>In our case, both lists are the same <code>std::tuple</code>, and <code>F</code> is <code>mp_list</code>, so <code>mp_product&lt;mp_list, L, L&gt;</code> will get us
  860. <code>std::tuple&lt;mp_list&lt;char, char&gt;, mp_list&lt;char, short&gt;, mp_list&lt;char, int&gt;, &#8230;&#8203;, mp_list&lt;unsigned long, long&gt;, mp_list&lt;unsigned long, unsigned long&gt;&gt;</code>.</p>
  861. </div>
  862. <div class="paragraph">
  863. <p>We then default-construct this tuple and pass it to <code>tuple_for_each</code>. <code>tuple_for_each(tp, f)</code> calls <code>f</code> for every
  864. tuple element; we use a (C++14) lambda that calls <code>test_result</code>.</p>
  865. </div>
  866. <div class="paragraph">
  867. <p>In pure C++11, we can&#8217;t use a lambda with an <code>auto&amp;&amp;</code> parameter, so we&#8217;ll have to make <code>test_result</code> a function object with
  868. a templated <code>operator()</code> and pass that to <code>tuple_for_each</code> directly:</p>
  869. </div>
  870. <div class="listingblock">
  871. <div class="content">
  872. <pre class="highlight"><code>struct test_result
  873. {
  874. template&lt;class T1, class T2&gt; void operator()( mp_list&lt;T1, T2&gt; const&amp; ) const
  875. {
  876. using T3 = decltype( T1() + T2() );
  877. using T4 = result&lt;T1, T2&gt;;
  878. std::cout &lt;&lt; ( std::is_same&lt;T3, T4&gt;::value? "[PASS] ": "[FAIL] " )
  879. &lt;&lt; name&lt;T1&gt;() &lt;&lt; " + " &lt;&lt; name&lt;T2&gt;() &lt;&lt; " -&gt; " &lt;&lt; name&lt;T3&gt;()
  880. &lt;&lt; ", result: " &lt;&lt; name&lt;T4&gt;() &lt;&lt; std::endl;
  881. }
  882. };
  883. int main()
  884. {
  885. using L = std::tuple&lt;char, short, int, unsigned, long, unsigned long&gt;;
  886. tuple_for_each( mp_product&lt;mp_list, L, L&gt;(), test_result() );
  887. }</code></pre>
  888. </div>
  889. </div>
  890. </div>
  891. <div class="sect2">
  892. <h3 id="writing_common_type_specializations">Writing common_type Specializations</h3>
  893. <div class="paragraph">
  894. <p>The standard trait <code>std::common_type</code>, used to obtain a type to which all of its arguments can convert without
  895. unnecessary loss of precision, can be user-specialized when its default implementation (based on the ternary <code>?:</code>
  896. operator) is unsuitable.</p>
  897. </div>
  898. <div class="paragraph">
  899. <p>Let&#8217;s write a <code>common_type</code> specialization for two <code>std::tuple</code> arguments. For that, we need a metafunction that
  900. applies <code>std::common_type</code> to each pair of elements and gathers the results into a tuple:</p>
  901. </div>
  902. <div class="listingblock">
  903. <div class="content">
  904. <pre class="highlight"><code>template&lt;class... T&gt; using common_type_t =
  905. typename std::common_type&lt;T...&gt;::type; // standard in C++14
  906. template&lt;class Tp1, class Tp2&gt; using common_tuple =
  907. mp_transform&lt;common_type_t, Tp1, Tp2&gt;;</code></pre>
  908. </div>
  909. </div>
  910. <div class="paragraph">
  911. <p>then specialize <code>common_type</code> to use it:</p>
  912. </div>
  913. <div class="listingblock">
  914. <div class="content">
  915. <pre class="highlight"><code>namespace std
  916. {
  917. template&lt;class... T1, class... T2&gt;
  918. struct common_type&lt;std::tuple&lt;T1...&gt;, std::tuple&lt;T2...&gt;&gt;:
  919. mp_defer&lt;common_tuple, std::tuple&lt;T1...&gt;, std::tuple&lt;T2...&gt;&gt;
  920. {
  921. };
  922. } // std</code></pre>
  923. </div>
  924. </div>
  925. <div class="paragraph">
  926. <p>(There is no need to specialize <code>std::common_type</code> for more than two arguments - it takes care of synthesizing the appropriate semantics from
  927. the binary case.)</p>
  928. </div>
  929. <div class="paragraph">
  930. <p>The subtlety here is the use of <code>mp_defer</code>. We could have defined a nested <code>type</code> to <code>common_tuple&lt;std::tuple&lt;T1&#8230;&#8203;&gt;, std::tuple&lt;T2&#8230;&#8203;&gt;&gt;</code>,
  931. and it would still have worked in all valid cases. By letting <code>mp_defer</code> define <code>type</code>, though, we make our specialization <em>SFINAE-friendly</em>.</p>
  932. </div>
  933. <div class="paragraph">
  934. <p>That is, when our <code>common_tuple</code> causes a substitution failure instead of a hard error, <code>mp_defer</code> will not define a nested <code>type</code>,
  935. and <code>common_type_t</code>, which is defined as <code>typename common_type&lt;&#8230;&#8203;&gt;::type</code>, will also cause a substitution failure.</p>
  936. </div>
  937. <div class="paragraph">
  938. <p>As another example, consider the hypothetical type <code>expected&lt;T, E&#8230;&#8203;&gt;</code> that represents either a successful return with a value of <code>T</code>,
  939. or an unsuccessful return with an error code of some type in the list <code>E&#8230;&#8203;</code>. The common type of <code>expected&lt;T1, E1, E2, E3&gt;</code> and
  940. <code>expected&lt;T2, E1, E4, E5&gt;</code> is <code>expected&lt;common_type_t&lt;T1, T2&gt;, E1, E2, E3, E4, E5&gt;</code>. That is, the possible return values are
  941. combined into their common type, and we take the union of the set of error types.</p>
  942. </div>
  943. <div class="paragraph">
  944. <p>Therefore,</p>
  945. </div>
  946. <div class="listingblock">
  947. <div class="content">
  948. <pre class="highlight"><code>template&lt;class T1, class E1, class T2, class E2&gt; using common_expected =
  949. mp_rename&lt;mp_push_front&lt;mp_unique&lt;mp_append&lt;E1, E2&gt;&gt;, common_type_t&lt;T1, T2&gt;&gt;,
  950. expected&gt;;
  951. namespace std
  952. {
  953. template&lt;class T1, class... E1, class T2, class... E2&gt;
  954. struct common_type&lt;expected&lt;T1, E1...&gt;, expected&lt;T2, E2...&gt;&gt;:
  955. mp_defer&lt;common_expected, T1, mp_list&lt;E1...&gt;, T2, mp_list&lt;E2...&gt;&gt;
  956. {
  957. };
  958. } // std</code></pre>
  959. </div>
  960. </div>
  961. <div class="paragraph">
  962. <p>Here we&#8217;ve taken a different tack; instead of passing the <code>expected</code> types to <code>common_expected</code>, we&#8217;re passing the <code>T</code> types and lists of
  963. the <code>E</code> types. This makes our job easier. <code>mp_unique&lt;mp_append&lt;E1, E2&gt;&gt;</code> gives us the concatenation of <code>E1</code> and <code>E2</code> with the duplicates
  964. removed; we then add <code>common_type_t&lt;T1, T2&gt;</code> to the front via <code>mp_push_front</code>; and finally, we <code>mp_rename</code> the resultant <code>mp_list</code>
  965. to <code>expected</code>.</p>
  966. </div>
  967. </div>
  968. <div class="sect2">
  969. <h3 id="fixing_tuple_cat">Fixing tuple_cat</h3>
  970. <div class="paragraph">
  971. <p>The article <a href="http://pdimov.com/cpp2/simple_cxx11_metaprogramming.html#">Simple C++11 metaprogramming</a> builds an
  972. implementation of the standard function <code>tuple_cat</code>, with the end result given below:</p>
  973. </div>
  974. <div class="listingblock">
  975. <div class="content">
  976. <pre class="highlight"><code>template&lt;class L&gt; using F = mp_iota&lt;mp_size&lt;L&gt;&gt;;
  977. template&lt;class R, class...Is, class... Ks, class Tp&gt;
  978. R tuple_cat_( mp_list&lt;Is...&gt;, mp_list&lt;Ks...&gt;, Tp tp )
  979. {
  980. return R{ std::get&lt;Ks::value&gt;(std::get&lt;Is::value&gt;(tp))... };
  981. }
  982. template&lt;class... Tp,
  983. class R = mp_append&lt;std::tuple&lt;&gt;, typename std::remove_reference&lt;Tp&gt;::type...&gt;&gt;
  984. R tuple_cat( Tp &amp;&amp;... tp )
  985. {
  986. std::size_t const N = sizeof...(Tp);
  987. // inner
  988. using list1 = mp_list&lt;
  989. mp_rename&lt;typename std::remove_reference&lt;Tp&gt;::type, mp_list&gt;...&gt;;
  990. using list2 = mp_iota_c&lt;N&gt;;
  991. using list3 = mp_transform&lt;mp_fill, list1, list2&gt;;
  992. using inner = mp_apply&lt;mp_append, list3&gt;;
  993. // outer
  994. using list4 = mp_transform&lt;F, list1&gt;;
  995. using outer = mp_apply&lt;mp_append, list4&gt;;
  996. //
  997. return tuple_cat_&lt;R&gt;( inner(), outer(),
  998. std::forward_as_tuple( std::forward&lt;Tp&gt;(tp)... ) );
  999. }</code></pre>
  1000. </div>
  1001. </div>
  1002. <div class="paragraph">
  1003. <p>This function, however, is not entirely correct, in that it doesn&#8217;t handle some cases properly. For example,
  1004. trying to concatenate tuples containing move-only elements such as <code>unique_ptr</code> fails:</p>
  1005. </div>
  1006. <div class="listingblock">
  1007. <div class="content">
  1008. <pre class="highlight"><code>std::tuple&lt;std::unique_ptr&lt;int&gt;&gt; t1;
  1009. std::tuple&lt;std::unique_ptr&lt;float&gt;&gt; t2;
  1010. auto result = ::tuple_cat( std::move( t1 ), std::move( t2 ) );</code></pre>
  1011. </div>
  1012. </div>
  1013. <div class="paragraph">
  1014. <p>Trying to concatenate <code>const</code> tuples fails:</p>
  1015. </div>
  1016. <div class="listingblock">
  1017. <div class="content">
  1018. <pre class="highlight"><code>std::tuple&lt;int&gt; const t1;
  1019. std::tuple&lt;float&gt; const t2;
  1020. auto result = ::tuple_cat( t1, t2 );</code></pre>
  1021. </div>
  1022. </div>
  1023. <div class="paragraph">
  1024. <p>And finally, the standard <code>tuple_cat</code> is specified to work on arbitrary tuple-like types (that is, all types
  1025. that support <code>tuple_size</code>, <code>tuple_element</code>, and <code>get</code>), while our implementation only works with <code>tuple</code> and
  1026. <code>pair</code>. <code>std::array</code>, for example, fails:</p>
  1027. </div>
  1028. <div class="listingblock">
  1029. <div class="content">
  1030. <pre class="highlight"><code>std::array&lt;int, 2&gt; t1{ 1, 2 };
  1031. std::array&lt;float, 3&gt; t2{ 3.0f, 4.0f, 5.0f };
  1032. auto result = ::tuple_cat( t1, t2 );</code></pre>
  1033. </div>
  1034. </div>
  1035. <div class="paragraph">
  1036. <p>Let&#8217;s fix these one by one. Support for move-only types is easy, if one knows where to look. The problem is
  1037. that <code>Tp</code> that we&#8217;re passing to the helper <code>tuple_cat_</code> is (correctly) <code>tuple&lt;unique_ptr&lt;int&gt;&amp;&amp;, unique_ptr&lt;float&gt;&amp;&amp;&gt;</code>,
  1038. but <code>std::get&lt;0&gt;(tp)</code> still returns <code>unique_ptr&lt;int&gt;&amp;</code>, because <code>tp</code> is an lvalue. This behavior is a bit
  1039. surprising, but is intended to prevent inadvertent double moves.</p>
  1040. </div>
  1041. <div class="paragraph">
  1042. <p>Long story short, we need <code>std::move(tp)</code> in <code>tuple_cat_</code> to make <code>tp</code> an rvalue:</p>
  1043. </div>
  1044. <div class="literalblock">
  1045. <div class="content">
  1046. <pre>template&lt;class R, class...Is, class... Ks, class Tp&gt;
  1047. R tuple_cat_( mp_list&lt;Is...&gt;, mp_list&lt;Ks...&gt;, Tp tp )
  1048. {
  1049. return R{ std::get&lt;Ks::value&gt;(std::get&lt;Is::value&gt;(std::move(tp)))... };
  1050. }</pre>
  1051. </div>
  1052. </div>
  1053. <div class="paragraph">
  1054. <p>Next, <code>const</code>-qualified tuples. The issue here is that we&#8217;re stripping references from the input tuples, but not
  1055. <code>const</code>. As a result, we&#8217;re trying to manipulate types such as <code>tuple&lt;int&gt; const</code> with Mp11 algorithms, and these
  1056. types do not fit the list concept. We just need to strip qualifiers as well, by defining the useful <code>remove_cv_ref</code>
  1057. primitive that is inexplicably missing from the standard library:</p>
  1058. </div>
  1059. <div class="literalblock">
  1060. <div class="content">
  1061. <pre>template&lt;class T&gt; using remove_cv_ref = typename std::remove_cv&lt;
  1062. typename std::remove_reference&lt;T&gt;::type&gt;::type;</pre>
  1063. </div>
  1064. </div>
  1065. <div class="paragraph">
  1066. <p>and then by using <code>remove_cv_ref&lt;Tp&gt;</code> in place of <code>typename std::remove_reference&lt;Tp&gt;::type</code>:</p>
  1067. </div>
  1068. <div class="listingblock">
  1069. <div class="content">
  1070. <pre class="highlight"><code>template&lt;class... Tp,
  1071. class R = mp_append&lt;std::tuple&lt;&gt;, remove_cv_ref&lt;Tp&gt;...&gt;&gt;
  1072. R tuple_cat( Tp &amp;&amp;... tp )
  1073. {
  1074. std::size_t const N = sizeof...(Tp);
  1075. // inner
  1076. using list1 = mp_list&lt;mp_rename&lt;remove_cv_ref&lt;Tp&gt;, mp_list&gt;...&gt;;
  1077. // ...</code></pre>
  1078. </div>
  1079. </div>
  1080. <div class="paragraph">
  1081. <p>Finally, tuple-like types. We&#8217;ve so far exploited the fact that <code>std::pair</code> and <code>std::tuple</code> are valid Mp11 lists,
  1082. but in general, arbitrary tuple-like types aren&#8217;t, so we need to convert them into such. For that, we&#8217;ll need to
  1083. define a metafunction <code>from_tuple_like</code> that will take an arbitrary tuple-like type and will return, in our case,
  1084. the corresponding <code>mp_list</code>.</p>
  1085. </div>
  1086. <div class="paragraph">
  1087. <p>Technically, a more principled approach would&#8217;ve been to return <code>std::tuple</code>, but here <code>mp_list</code> will prove more
  1088. convenient.</p>
  1089. </div>
  1090. <div class="paragraph">
  1091. <p>What we need is, given a tuple-like type <code>Tp</code>, to obtain <code>mp_list&lt;std::tuple_element&lt;0, Tp&gt;::type, std::tuple_element&lt;1, Tp&gt;::type,
  1092. &#8230;&#8203;, std::tuple_element&lt;N-1, Tp&gt;::type&gt;</code>, where <code>N</code> is <code>tuple_size&lt;Tp&gt;::value</code>. Here&#8217;s one way to do it:</p>
  1093. </div>
  1094. <div class="listingblock">
  1095. <div class="content">
  1096. <pre class="highlight"><code>template&lt;class T, class I&gt; using tuple_element =
  1097. typename std::tuple_element&lt;I::value, T&gt;::type;
  1098. template&lt;class T&gt; using from_tuple_like =
  1099. mp_product&lt;tuple_element, mp_list&lt;T&gt;, mp_iota&lt;std::tuple_size&lt;T&gt;&gt;&gt;;</code></pre>
  1100. </div>
  1101. </div>
  1102. <div class="paragraph">
  1103. <p>(<code>mp_iota&lt;N&gt;</code> is an algorithm that returns an <code>mp_list</code> with elements <code>mp_size_t&lt;0&gt;</code>, <code>mp_size_t&lt;1&gt;</code>, &#8230;&#8203;, <code>mp_size_t&lt;N-1&gt;</code>.)</p>
  1104. </div>
  1105. <div class="paragraph">
  1106. <p>Remember that <code>mp_product&lt;F, L1, L2&gt;</code> performs the equivalent of two nested loops over the elements of <code>L1</code> and <code>L2</code>,
  1107. applying <code>F</code> to the two variables and gathering the result. In our case <code>L1</code> consists of the single element <code>T</code>, so
  1108. only the second loop (over <code>mp_iota&lt;N&gt;</code>, where <code>N</code> is <code>tuple_size&lt;T&gt;</code>), remains, and we get a list of the same type
  1109. as <code>L1</code> (an <code>mp_list</code>) with contents <code>tuple_element&lt;T, mp_size_t&lt;0&gt;&gt;</code>, <code>tuple_element&lt;T, mp_size_t&lt;1&gt;&gt;</code>, &#8230;&#8203;,
  1110. <code>tuple_element&lt;T, mp_size_t&lt;N-1&gt;&gt;</code>.</p>
  1111. </div>
  1112. <div class="paragraph">
  1113. <p>For completeness&#8217;s sake, here&#8217;s another, more traditional way to achieve the same result:</p>
  1114. </div>
  1115. <div class="literalblock">
  1116. <div class="content">
  1117. <pre>template&lt;class T&gt; using from_tuple_like =
  1118. mp_transform_q&lt;mp_bind_front&lt;tuple_element, T&gt;, mp_iota&lt;std::tuple_size&lt;T&gt;&gt;&gt;;</pre>
  1119. </div>
  1120. </div>
  1121. <div class="paragraph">
  1122. <p>With all these fixes applied, our fully operational <code>tuple_cat</code> now looks like this:</p>
  1123. </div>
  1124. <div class="listingblock">
  1125. <div class="content">
  1126. <pre class="highlight"><code>template&lt;class L&gt; using F = mp_iota&lt;mp_size&lt;L&gt;&gt;;
  1127. template&lt;class R, class...Is, class... Ks, class Tp&gt;
  1128. R tuple_cat_( mp_list&lt;Is...&gt;, mp_list&lt;Ks...&gt;, Tp tp )
  1129. {
  1130. return R{ std::get&lt;Ks::value&gt;(std::get&lt;Is::value&gt;(std::move(tp)))... };
  1131. }
  1132. template&lt;class T&gt; using remove_cv_ref = typename std::remove_cv&lt;
  1133. typename std::remove_reference&lt;T&gt;::type&gt;::type;
  1134. template&lt;class T, class I&gt; using tuple_element =
  1135. typename std::tuple_element&lt;I::value, T&gt;::type;
  1136. template&lt;class T&gt; using from_tuple_like =
  1137. mp_product&lt;tuple_element, mp_list&lt;T&gt;, mp_iota&lt;std::tuple_size&lt;T&gt;&gt;&gt;;
  1138. template&lt;class... Tp,
  1139. class R = mp_append&lt;std::tuple&lt;&gt;, from_tuple_like&lt;remove_cv_ref&lt;Tp&gt;&gt;...&gt;&gt;
  1140. R tuple_cat( Tp &amp;&amp;... tp )
  1141. {
  1142. std::size_t const N = sizeof...(Tp);
  1143. // inner
  1144. using list1 = mp_list&lt;from_tuple_like&lt;remove_cv_ref&lt;Tp&gt;&gt;...&gt;;
  1145. using list2 = mp_iota_c&lt;N&gt;;
  1146. using list3 = mp_transform&lt;mp_fill, list1, list2&gt;;
  1147. using inner = mp_apply&lt;mp_append, list3&gt;;
  1148. // outer
  1149. using list4 = mp_transform&lt;F, list1&gt;;
  1150. using outer = mp_apply&lt;mp_append, list4&gt;;
  1151. //
  1152. return tuple_cat_&lt;R&gt;( inner(), outer(),
  1153. std::forward_as_tuple( std::forward&lt;Tp&gt;(tp)... ) );
  1154. }</code></pre>
  1155. </div>
  1156. </div>
  1157. </div>
  1158. <div class="sect2">
  1159. <h3 id="computing_return_types">Computing Return Types</h3>
  1160. <div class="paragraph">
  1161. <p>C++17 has a standard variant type, called <code>std::variant</code>. It also defines a function template
  1162. <code>std::visit</code> that can be used to apply a function to the contained value of one or more variants.
  1163. So for instance, if the variant <code>v1</code> contains <code>1</code>, and the variant <code>v2</code> contains <code>2.0f</code>,
  1164. <code>std::visit(f, v1, v2)</code> will call <code>f(1, 2.0f)</code>.</p>
  1165. </div>
  1166. <div class="paragraph">
  1167. <p>However, <code>std::visit</code> has one limitation: it cannot return a result unless all
  1168. possible applications of the function have the same return type. If, for instance, <code>v1</code> and <code>v2</code>
  1169. are both of type <code>std::variant&lt;short, int, float&gt;</code>,</p>
  1170. </div>
  1171. <div class="literalblock">
  1172. <div class="content">
  1173. <pre>std::visit( []( auto const&amp; x, auto const&amp; y ){ return x + y; }, v1, v2 );</pre>
  1174. </div>
  1175. </div>
  1176. <div class="paragraph">
  1177. <p>will fail to compile because the result of <code>x + y</code> can be either <code>int</code> or <code>float</code> depending on
  1178. what <code>v1</code> and <code>v2</code> hold.</p>
  1179. </div>
  1180. <div class="paragraph">
  1181. <p>A type that can hold either <code>int</code> or <code>float</code> already exists, called, surprisingly enough, <code>std::variant&lt;int, float&gt;</code>.
  1182. Let&#8217;s write our own function template <code>rvisit</code> that is the same as <code>visit</code> but returns a <code>variant</code>:</p>
  1183. </div>
  1184. <div class="listingblock">
  1185. <div class="content">
  1186. <pre class="highlight"><code>template&lt;class F, class... V&gt; auto rvisit( F&amp;&amp; f, V&amp;&amp;... v )
  1187. {
  1188. using R = /*...*/;
  1189. return std::visit( [&amp;]( auto&amp;&amp;... x )
  1190. { return R( std::forward&lt;F&gt;(f)( std::forward&lt;decltype(x)&gt;(x)... ) ); },
  1191. std::forward&lt;V&gt;( v )... );
  1192. }</code></pre>
  1193. </div>
  1194. </div>
  1195. <div class="paragraph">
  1196. <p>What this does is basically calls <code>std::visit</code> to do the work, but instead of passing it <code>f</code>, we pass a lambda that does the same as <code>f</code> except
  1197. it converts the result to a common type <code>R</code>. <code>R</code> is supposed to be <code>std::variant&lt;&#8230;&#8203;&gt;</code> where the ellipsis denotes the return types of
  1198. calling <code>f</code> with all possible combinations of variant values.</p>
  1199. </div>
  1200. <div class="paragraph">
  1201. <p>We&#8217;ll first define a helper quoted metafunction <code>Qret&lt;F&gt;</code> that returns the result of the application of <code>F</code> to arguments of type <code>T&#8230;&#8203;</code>:</p>
  1202. </div>
  1203. <div class="literalblock">
  1204. <div class="content">
  1205. <pre>template&lt;class F&gt; struct Qret
  1206. {
  1207. template&lt;class... T&gt; using fn =
  1208. decltype( std::declval&lt;F&gt;()( std::declval&lt;T&gt;()... ) );
  1209. };</pre>
  1210. </div>
  1211. </div>
  1212. <div class="paragraph">
  1213. <p>(Unfortunately, we can&#8217;t just define this metafunction inside <code>rvisit</code>; the language prohibits defining template aliases inside functions.)</p>
  1214. </div>
  1215. <div class="paragraph">
  1216. <p>With <code>Qret</code> in hand, a <code>variant</code> of the possible return types is just a matter of applying it over the possible combinations of the variant values:</p>
  1217. </div>
  1218. <div class="literalblock">
  1219. <div class="content">
  1220. <pre>using R = mp_product_q&lt;Qret&lt;F&gt;, std::remove_reference_t&lt;V&gt;...&gt;;</pre>
  1221. </div>
  1222. </div>
  1223. <div class="paragraph">
  1224. <p>Why does this work? <code>mp_product&lt;F, L1&lt;T1&#8230;&#8203;&gt;, L2&lt;T2&#8230;&#8203;&gt;, &#8230;&#8203;, Ln&lt;Tn&#8230;&#8203;&gt;&gt;</code> returns <code>L1&lt;F&lt;U1, U2, &#8230;&#8203;, Un&gt;, &#8230;&#8203;&gt;</code>, where <code>Ui</code> traverse all
  1225. possible combinations of list values. Since in our case all <code>Li</code> are <code>std::variant</code>, the result will also be <code>std::variant</code>. (<code>mp_product_q</code> is
  1226. the same as <code>mp_product</code>, but for quoted metafunctions such as our <code>Qret&lt;F&gt;</code>.)</p>
  1227. </div>
  1228. <div class="paragraph">
  1229. <p>One more step remains. Suppose that, as above, we&#8217;re passing two variants of type <code>std::variant&lt;short, int, float&gt;</code> and <code>F</code> is
  1230. <code>[]( auto const&amp; x, auto const&amp; y ){ return x + y; }</code>. This will generate <code>R</code> of length 9, one per each combination, but many of those
  1231. elements will be the same, either <code>int</code> or <code>float</code>, and we need to filter out the duplicates. So, we pass the result to <code>mp_unique</code>:</p>
  1232. </div>
  1233. <div class="literalblock">
  1234. <div class="content">
  1235. <pre>using R = mp_unique&lt;mp_product_q&lt;Qret&lt;F&gt;, std::remove_reference_t&lt;V&gt;...&gt;&gt;;</pre>
  1236. </div>
  1237. </div>
  1238. <div class="paragraph">
  1239. <p>and we&#8217;re done:</p>
  1240. </div>
  1241. <div class="listingblock">
  1242. <div class="content">
  1243. <pre class="highlight"><code>#include &lt;boost/mp11.hpp&gt;
  1244. #include &lt;boost/core/demangle.hpp&gt;
  1245. #include &lt;variant&gt;
  1246. #include &lt;type_traits&gt;
  1247. #include &lt;typeinfo&gt;
  1248. #include &lt;iostream&gt;
  1249. using namespace boost::mp11;
  1250. template&lt;class F&gt; struct Qret
  1251. {
  1252. template&lt;class... T&gt; using fn =
  1253. decltype( std::declval&lt;F&gt;()( std::declval&lt;T&gt;()... ) );
  1254. };
  1255. template&lt;class F, class... V&gt; auto rvisit( F&amp;&amp; f, V&amp;&amp;... v )
  1256. {
  1257. using R = mp_unique&lt;mp_product_q&lt;Qret&lt;F&gt;, std::remove_reference_t&lt;V&gt;...&gt;&gt;;
  1258. return std::visit( [&amp;]( auto&amp;&amp;... x )
  1259. { return R( std::forward&lt;F&gt;(f)( std::forward&lt;decltype(x)&gt;(x)... ) ); },
  1260. std::forward&lt;V&gt;( v )... );
  1261. }
  1262. template&lt;class T&gt; std::string name()
  1263. {
  1264. return boost::core::demangle( typeid(T).name() );
  1265. }
  1266. template&lt;class V&gt; void print_variant( char const * n, V const&amp; v )
  1267. {
  1268. std::cout &lt;&lt; "(" &lt;&lt; name&lt;decltype(v)&gt;() &lt;&lt; ")" &lt;&lt; n &lt;&lt; ": ";
  1269. std::visit( []( auto const&amp; x )
  1270. { std::cout &lt;&lt; "(" &lt;&lt; name&lt;decltype(x)&gt;() &lt;&lt; ")" &lt;&lt; x &lt;&lt; std::endl; }, v );
  1271. }
  1272. int main()
  1273. {
  1274. std::variant&lt;char, int, float&gt; v1( 1 );
  1275. print_variant( "v1", v1 );
  1276. std::variant&lt;short, int, double&gt; v2( 3.14 );
  1277. print_variant( "v2", v2 );
  1278. auto v3 = rvisit( []( auto const&amp; x, auto const&amp; y ){ return x + y; }, v1, v2 );
  1279. print_variant( "v3", v3 );
  1280. }</code></pre>
  1281. </div>
  1282. </div>
  1283. </div>
  1284. </div>
  1285. </div>
  1286. <div class="sect1">
  1287. <h2 id="changelog">Revision History</h2>
  1288. <div class="sectionbody">
  1289. <div class="sect2">
  1290. <h3 id="changes_in_1_70_0">Changes in 1.70.0</h3>
  1291. <div class="ulist">
  1292. <ul>
  1293. <li>
  1294. <p>Renamed <code>mp_invoke</code> to <code>mp_invoke_q</code></p>
  1295. </li>
  1296. <li>
  1297. <p>Added <code>mp_similar</code></p>
  1298. </li>
  1299. <li>
  1300. <p>Added <code>mp_set_union</code>, <code>mp_set_intersection</code>, <code>mp_set_difference</code></p>
  1301. </li>
  1302. <li>
  1303. <p>Added <code>mp_not_fn</code></p>
  1304. </li>
  1305. <li>
  1306. <p>Added <code>mp_transform_first</code>, <code>mp_transform_second</code>, <code>mp_transform_third</code></p>
  1307. </li>
  1308. <li>
  1309. <p>Added <code>mp_filter</code></p>
  1310. </li>
  1311. <li>
  1312. <p>Added <code>mp_eval_if_not</code>, <code>mp_eval_or</code>, <code>mp_valid_q</code></p>
  1313. </li>
  1314. <li>
  1315. <p>Added <code>mp_back</code>, <code>mp_pop_back</code></p>
  1316. </li>
  1317. <li>
  1318. <p>Added <code>BOOST_MP11_VERSION</code></p>
  1319. </li>
  1320. </ul>
  1321. </div>
  1322. </div>
  1323. <div class="sect2">
  1324. <h3 id="changes_in_1_69_0">Changes in 1.69.0</h3>
  1325. <div class="ulist">
  1326. <ul>
  1327. <li>
  1328. <p>Removed dependency on Boost.Config; Mp11 is now standalone</p>
  1329. </li>
  1330. <li>
  1331. <p>Improved code generation for <code>mp_with_index</code></p>
  1332. </li>
  1333. <li>
  1334. <p>Added <code>mp_starts_with</code> (contributed by Glen Fernandes)</p>
  1335. </li>
  1336. <li>
  1337. <p>Added CMake support</p>
  1338. </li>
  1339. </ul>
  1340. </div>
  1341. </div>
  1342. </div>
  1343. </div>
  1344. <div class="sect1">
  1345. <h2 id="reference">Reference</h2>
  1346. <div class="sectionbody">
  1347. <div class="paragraph">
  1348. <p>The contents of the library are in namespace <code>boost::mp11</code>.</p>
  1349. </div>
  1350. <div class="sect2">
  1351. <h3 id="integral">Integral Constants, &lt;boost/mp11/integral.hpp&gt;</h3>
  1352. <div class="paragraph">
  1353. <p>For an Mp11 integral constant type <code>T</code>, <code>T::value</code> is an integral constant in the C++ sense.</p>
  1354. </div>
  1355. <div class="sect3">
  1356. <h4 id="mp_boolb">mp_bool&lt;B&gt;</h4>
  1357. <div class="literalblock">
  1358. <div class="content">
  1359. <pre>template&lt;bool B&gt; using mp_bool = std::integral_constant&lt;bool, B&gt;;</pre>
  1360. </div>
  1361. </div>
  1362. <div class="paragraph">
  1363. <p>Same as <code>std::bool_constant</code> in C++17.</p>
  1364. </div>
  1365. </div>
  1366. <div class="sect3">
  1367. <h4 id="mp_true">mp_true</h4>
  1368. <div class="literalblock">
  1369. <div class="content">
  1370. <pre>using mp_true = mp_bool&lt;true&gt;;</pre>
  1371. </div>
  1372. </div>
  1373. <div class="paragraph">
  1374. <p>Same as <code>std::true_type</code>.</p>
  1375. </div>
  1376. </div>
  1377. <div class="sect3">
  1378. <h4 id="mp_false">mp_false</h4>
  1379. <div class="literalblock">
  1380. <div class="content">
  1381. <pre>using mp_false = mp_bool&lt;false&gt;;</pre>
  1382. </div>
  1383. </div>
  1384. <div class="paragraph">
  1385. <p>Same as <code>std::false_type</code>.</p>
  1386. </div>
  1387. </div>
  1388. <div class="sect3">
  1389. <h4 id="mp_to_boolt">mp_to_bool&lt;T&gt;</h4>
  1390. <div class="literalblock">
  1391. <div class="content">
  1392. <pre>template&lt;class T&gt; using mp_to_bool = mp_bool&lt;static_cast&lt;bool&gt;(T::value)&gt;;</pre>
  1393. </div>
  1394. </div>
  1395. </div>
  1396. <div class="sect3">
  1397. <h4 id="mp_nott">mp_not&lt;T&gt;</h4>
  1398. <div class="literalblock">
  1399. <div class="content">
  1400. <pre>template&lt;class T&gt; using mp_not = mp_bool&lt; !T::value &gt;;</pre>
  1401. </div>
  1402. </div>
  1403. </div>
  1404. <div class="sect3">
  1405. <h4 id="mp_inti">mp_int&lt;I&gt;</h4>
  1406. <div class="literalblock">
  1407. <div class="content">
  1408. <pre>template&lt;int I&gt; using mp_int = std::integral_constant&lt;int, I&gt;;</pre>
  1409. </div>
  1410. </div>
  1411. </div>
  1412. <div class="sect3">
  1413. <h4 id="mp_size_tn">mp_size_t&lt;N&gt;</h4>
  1414. <div class="literalblock">
  1415. <div class="content">
  1416. <pre>template&lt;std::size_t N&gt; using mp_size_t = std::integral_constant&lt;std::size_t, N&gt;;</pre>
  1417. </div>
  1418. </div>
  1419. </div>
  1420. </div>
  1421. <div class="sect2">
  1422. <h3 id="list">List Operations, &lt;boost/mp11/list.hpp&gt;</h3>
  1423. <div class="sect3">
  1424. <h4 id="mp_listt">mp_list&lt;T&#8230;&#8203;&gt;</h4>
  1425. <div class="literalblock">
  1426. <div class="content">
  1427. <pre>template&lt;class... T&gt; struct mp_list {};</pre>
  1428. </div>
  1429. </div>
  1430. <div class="paragraph">
  1431. <p><code>mp_list</code> is the standard list type of Mp11, although the library is not restricted to it and can operate on arbitrary class templates
  1432. such as <code>std::tuple</code> or <code>std::variant</code>. Even <code>std::pair</code> can be used if the transformation does not alter the number of the elements in
  1433. the list.</p>
  1434. </div>
  1435. </div>
  1436. <div class="sect3">
  1437. <h4 id="mp_list_ct_i">mp_list_c&lt;T, I&#8230;&#8203;&gt;</h4>
  1438. <div class="literalblock">
  1439. <div class="content">
  1440. <pre>template&lt;class T, T... I&gt; using mp_list_c =
  1441. mp_list&lt;std::integral_constant&lt;T, I&gt;...&gt;;</pre>
  1442. </div>
  1443. </div>
  1444. <div class="paragraph">
  1445. <p><code>mp_list_c</code> produces an <code>mp_list</code> of the <code>std::integral_constant</code> types corresponding to its integer template arguments.</p>
  1446. </div>
  1447. <div class="listingblock">
  1448. <div class="title">Code Example 1. Using mp_list_c</div>
  1449. <div class="content">
  1450. <pre class="highlight"><code>using L1 = mp_list_c&lt;int, 2, 3&gt;; // mp_list&lt;mp_int&lt;2&gt;, mp_int&lt;3&gt;&gt;</code></pre>
  1451. </div>
  1452. </div>
  1453. </div>
  1454. <div class="sect3">
  1455. <h4 id="mp_is_listl">mp_is_list&lt;L&gt;</h4>
  1456. <div class="literalblock">
  1457. <div class="content">
  1458. <pre>template&lt;class L&gt; using mp_is_list = /*...*/;</pre>
  1459. </div>
  1460. </div>
  1461. <div class="paragraph">
  1462. <p><code>mp_is_list&lt;L&gt;</code> is <code>mp_true</code> if <code>L</code> is a list (an instantiation of a class template whose template parameters are types), <code>mp_false</code> otherwise.</p>
  1463. </div>
  1464. </div>
  1465. <div class="sect3">
  1466. <h4 id="mp_sizel">mp_size&lt;L&gt;</h4>
  1467. <div class="literalblock">
  1468. <div class="content">
  1469. <pre>template&lt;class L&gt; using mp_size = /*...*/;</pre>
  1470. </div>
  1471. </div>
  1472. <div class="paragraph">
  1473. <p><code>mp_size&lt;L&gt;</code> returns the number of elements in the list <code>L</code>, as a <code>mp_size_t</code>. In other words, <code>mp_size&lt;L&lt;T&#8230;&#8203;&gt;&gt;</code> is an alias for
  1474. <code>mp_size_t&lt;sizeof&#8230;&#8203;(T)&gt;</code>.</p>
  1475. </div>
  1476. <div class="listingblock">
  1477. <div class="title">Code Example 2. Using mp_size with mp_list</div>
  1478. <div class="content">
  1479. <pre class="highlight"><code>using L1 = mp_list&lt;&gt;;
  1480. using R1 = mp_size&lt;L1&gt;; // mp_size_t&lt;0&gt;</code></pre>
  1481. </div>
  1482. </div>
  1483. <div class="listingblock">
  1484. <div class="title">Code Example 3. Using mp_size with std::pair</div>
  1485. <div class="content">
  1486. <pre class="highlight"><code>using L2 = std::pair&lt;int, int&gt;;
  1487. using R2 = mp_size&lt;L2&gt;; // mp_size_t&lt;2&gt;</code></pre>
  1488. </div>
  1489. </div>
  1490. <div class="listingblock">
  1491. <div class="title">Code Example 4. Using mp_size with std::tuple</div>
  1492. <div class="content">
  1493. <pre class="highlight"><code>using L3 = std::tuple&lt;float&gt;;
  1494. using R3 = mp_size&lt;L3&gt;; // mp_size_t&lt;1&gt;</code></pre>
  1495. </div>
  1496. </div>
  1497. </div>
  1498. <div class="sect3">
  1499. <h4 id="mp_emptyl">mp_empty&lt;L&gt;</h4>
  1500. <div class="literalblock">
  1501. <div class="content">
  1502. <pre>template&lt;class L&gt; using mp_empty = mp_bool&lt;mp_size&lt;L&gt;::value == 0&gt;;</pre>
  1503. </div>
  1504. </div>
  1505. <div class="paragraph">
  1506. <p><code>mp_empty&lt;L&gt;</code> is an alias for <code>mp_true</code> if the list <code>L</code> is empty, for <code>mp_false</code> otherwise.</p>
  1507. </div>
  1508. <div class="listingblock">
  1509. <div class="title">Code Example 5. Using mp_empty with std::tuple</div>
  1510. <div class="content">
  1511. <pre class="highlight"><code>using L1 = std::tuple&lt;float&gt;;
  1512. using R1 = mp_empty&lt;L1&gt;; // mp_false
  1513. using L2 = std::tuple&lt;&gt;;
  1514. using R2 = mp_empty&lt;L2&gt;; // mp_true</code></pre>
  1515. </div>
  1516. </div>
  1517. </div>
  1518. <div class="sect3">
  1519. <h4 id="mp_assignl1_l2">mp_assign&lt;L1, L2&gt;</h4>
  1520. <div class="literalblock">
  1521. <div class="content">
  1522. <pre>template&lt;class L1, class L2&gt; using mp_assign = /*...*/;</pre>
  1523. </div>
  1524. </div>
  1525. <div class="paragraph">
  1526. <p><code>mp_assign&lt;L1&lt;T1&#8230;&#8203;&gt;, L2&lt;T2&#8230;&#8203;&gt;&gt;</code> is an alias for <code>L1&lt;T2&#8230;&#8203;&gt;</code>. That is, it replaces the elements of <code>L1</code> with those of <code>L2</code>.</p>
  1527. </div>
  1528. <div class="listingblock">
  1529. <div class="title">Code Example 6. Using mp_assign with mp_list and std::tuple</div>
  1530. <div class="content">
  1531. <pre class="highlight"><code>using L1 = std::tuple&lt;long&gt;;
  1532. using L2 = mp_list&lt;int, float&gt;;
  1533. using R1 = mp_assign&lt;L1, L2&gt;; // std::tuple&lt;int, float&gt;</code></pre>
  1534. </div>
  1535. </div>
  1536. <div class="listingblock">
  1537. <div class="title">Code Example 7. Using mp_assign with mp_list and std::pair</div>
  1538. <div class="content">
  1539. <pre class="highlight"><code>using L1 = std::pair&lt;long, char&gt;;
  1540. using L2 = mp_list&lt;int, float&gt;;
  1541. using R1 = mp_assign&lt;L1, L2&gt;; // std::pair&lt;int, float&gt;</code></pre>
  1542. </div>
  1543. </div>
  1544. </div>
  1545. <div class="sect3">
  1546. <h4 id="mp_clearl">mp_clear&lt;L&gt;</h4>
  1547. <div class="literalblock">
  1548. <div class="content">
  1549. <pre>template&lt;class L&gt; using mp_clear = mp_assign&lt;L, mp_list&lt;&gt;&gt;;</pre>
  1550. </div>
  1551. </div>
  1552. <div class="paragraph">
  1553. <p><code>mp_clear&lt;L&lt;T&#8230;&#8203;&gt;&gt;</code> is an alias for <code>L&lt;&gt;</code>, that is, it removes the elements of <code>L</code>.</p>
  1554. </div>
  1555. <div class="listingblock">
  1556. <div class="title">Code Example 8. Using mp_clear with std::tuple</div>
  1557. <div class="content">
  1558. <pre class="highlight"><code>using L1 = std::tuple&lt;int, float&gt;;
  1559. using R1 = mp_clear&lt;L1&gt;; // std::tuple&lt;&gt;</code></pre>
  1560. </div>
  1561. </div>
  1562. </div>
  1563. <div class="sect3">
  1564. <h4 id="mp_frontl">mp_front&lt;L&gt;</h4>
  1565. <div class="literalblock">
  1566. <div class="content">
  1567. <pre>template&lt;class L&gt; using mp_front = /*...*/;</pre>
  1568. </div>
  1569. </div>
  1570. <div class="paragraph">
  1571. <p><code>mp_front&lt;L&gt;</code> is the first element of the list <code>L</code>. That is, <code>mp_front&lt;L&lt;T1, T&#8230;&#8203;&gt;&gt;</code> is an alias for <code>T1</code>.</p>
  1572. </div>
  1573. <div class="listingblock">
  1574. <div class="title">Code Example 9. Using mp_front with std::pair</div>
  1575. <div class="content">
  1576. <pre class="highlight"><code>using L1 = std::pair&lt;int, float&gt;;
  1577. using R1 = mp_front&lt;L1&gt;; // int</code></pre>
  1578. </div>
  1579. </div>
  1580. <div class="listingblock">
  1581. <div class="title">Code Example 10. Using mp_front with std::tuple</div>
  1582. <div class="content">
  1583. <pre class="highlight"><code>using L2 = std::tuple&lt;float, double, long double&gt;;
  1584. using R2 = mp_front&lt;L2&gt;; // float</code></pre>
  1585. </div>
  1586. </div>
  1587. <div class="listingblock">
  1588. <div class="title">Code Example 11. Using mp_front with mp_list</div>
  1589. <div class="content">
  1590. <pre class="highlight"><code>using L3 = mp_list&lt;char[1], char[2], char[3], char[4]&gt;;
  1591. using R3 = mp_front&lt;L3&gt;; // char[1]</code></pre>
  1592. </div>
  1593. </div>
  1594. </div>
  1595. <div class="sect3">
  1596. <h4 id="mp_pop_frontl">mp_pop_front&lt;L&gt;</h4>
  1597. <div class="literalblock">
  1598. <div class="content">
  1599. <pre>template&lt;class L&gt; using mp_pop_front = /*...*/;</pre>
  1600. </div>
  1601. </div>
  1602. <div class="paragraph">
  1603. <p><code>mp_pop_front&lt;L&gt;</code> removes the first element of the list <code>L</code>. That is, <code>mp_pop_front&lt;L&lt;T1, T&#8230;&#8203;&gt;&gt;</code> is an alias for <code>L&lt;T&#8230;&#8203;&gt;</code>.</p>
  1604. </div>
  1605. <div class="listingblock">
  1606. <div class="title">Code Example 12. Using mp_pop_front with std::tuple</div>
  1607. <div class="content">
  1608. <pre class="highlight"><code>using L1 = std::tuple&lt;float, double, long double&gt;;
  1609. using R1 = mp_pop_front&lt;L1&gt;; // std::tuple&lt;double, long double&gt;</code></pre>
  1610. </div>
  1611. </div>
  1612. <div class="listingblock">
  1613. <div class="title">Code Example 13. Using mp_pop_front with mp_list</div>
  1614. <div class="content">
  1615. <pre class="highlight"><code>using L2 = mp_list&lt;void&gt;;
  1616. using R2 = mp_pop_front&lt;L2&gt;; // mp_list&lt;&gt;</code></pre>
  1617. </div>
  1618. </div>
  1619. </div>
  1620. <div class="sect3">
  1621. <h4 id="mp_firstl">mp_first&lt;L&gt;</h4>
  1622. <div class="literalblock">
  1623. <div class="content">
  1624. <pre>template&lt;class L&gt; using mp_first = mp_front&lt;L&gt;;</pre>
  1625. </div>
  1626. </div>
  1627. <div class="paragraph">
  1628. <p><code>mp_first</code> is another name for <code>mp_front</code>.</p>
  1629. </div>
  1630. </div>
  1631. <div class="sect3">
  1632. <h4 id="mp_restl">mp_rest&lt;L&gt;</h4>
  1633. <div class="literalblock">
  1634. <div class="content">
  1635. <pre>template&lt;class L&gt; using mp_rest = mp_pop_front&lt;L&gt;;</pre>
  1636. </div>
  1637. </div>
  1638. <div class="paragraph">
  1639. <p><code>mp_rest</code> is another name for <code>mp_pop_front</code>.</p>
  1640. </div>
  1641. </div>
  1642. <div class="sect3">
  1643. <h4 id="mp_secondl">mp_second&lt;L&gt;</h4>
  1644. <div class="literalblock">
  1645. <div class="content">
  1646. <pre>template&lt;class L&gt; using mp_second = /*...*/;</pre>
  1647. </div>
  1648. </div>
  1649. <div class="paragraph">
  1650. <p><code>mp_second&lt;L&gt;</code> is the second element of the list <code>L</code>. That is, <code>mp_second&lt;L&lt;T1, T2, T&#8230;&#8203;&gt;&gt;</code> is an alias for <code>T2</code>.</p>
  1651. </div>
  1652. <div class="listingblock">
  1653. <div class="title">Code Example 14. Using mp_second with std::pair</div>
  1654. <div class="content">
  1655. <pre class="highlight"><code>using L1 = std::pair&lt;int, float&gt;;
  1656. using R1 = mp_second&lt;L1&gt;; // float</code></pre>
  1657. </div>
  1658. </div>
  1659. <div class="listingblock">
  1660. <div class="title">Code Example 15. Using mp_second with std::tuple</div>
  1661. <div class="content">
  1662. <pre class="highlight"><code>using L2 = std::tuple&lt;float, double, long double&gt;;
  1663. using R2 = mp_second&lt;L2&gt;; // double</code></pre>
  1664. </div>
  1665. </div>
  1666. <div class="listingblock">
  1667. <div class="title">Code Example 16. Using mp_second with mp_list</div>
  1668. <div class="content">
  1669. <pre class="highlight"><code>using L3 = mp_list&lt;char[1], char[2], char[3], char[4]&gt;;
  1670. using R3 = mp_second&lt;L3&gt;; // char[2]</code></pre>
  1671. </div>
  1672. </div>
  1673. </div>
  1674. <div class="sect3">
  1675. <h4 id="mp_thirdl">mp_third&lt;L&gt;</h4>
  1676. <div class="literalblock">
  1677. <div class="content">
  1678. <pre>template&lt;class L&gt; using mp_third = /*...*/;</pre>
  1679. </div>
  1680. </div>
  1681. <div class="paragraph">
  1682. <p><code>mp_third&lt;L&gt;</code> is the third element of the list <code>L</code>. That is, <code>mp_third&lt;L&lt;T1, T2, T3, T&#8230;&#8203;&gt;&gt;</code> is an alias for <code>T3</code>.</p>
  1683. </div>
  1684. <div class="listingblock">
  1685. <div class="title">Code Example 17. Using mp_third with std::tuple</div>
  1686. <div class="content">
  1687. <pre class="highlight"><code>using L1 = std::tuple&lt;float, double, long double&gt;;
  1688. using R1 = mp_third&lt;L1&gt;; // long double</code></pre>
  1689. </div>
  1690. </div>
  1691. <div class="listingblock">
  1692. <div class="title">Code Example 18. Using mp_third with mp_list</div>
  1693. <div class="content">
  1694. <pre class="highlight"><code>using L2 = mp_list&lt;char[1], char[2], char[3], char[4]&gt;;
  1695. using R2 = mp_third&lt;L2&gt;; // char[3]</code></pre>
  1696. </div>
  1697. </div>
  1698. </div>
  1699. <div class="sect3">
  1700. <h4 id="mp_push_frontl_t">mp_push_front&lt;L, T&#8230;&#8203;&gt;</h4>
  1701. <div class="literalblock">
  1702. <div class="content">
  1703. <pre>template&lt;class L, class... T&gt; using mp_push_front = /*...*/;</pre>
  1704. </div>
  1705. </div>
  1706. <div class="paragraph">
  1707. <p><code>mp_push_front&lt;L, T&#8230;&#8203;&gt;</code> inserts the elements <code>T&#8230;&#8203;</code> at the front of the list <code>L</code>. That is, <code>mp_push_front&lt;L&lt;U&#8230;&#8203;&gt;, T&#8230;&#8203;&gt;</code>
  1708. is an alias for <code>L&lt;T&#8230;&#8203;, U&#8230;&#8203;&gt;</code>.</p>
  1709. </div>
  1710. <div class="listingblock">
  1711. <div class="title">Code Example 19. Using mp_push_front with std::tuple</div>
  1712. <div class="content">
  1713. <pre class="highlight"><code>using L1 = std::tuple&lt;double, long double&gt;;
  1714. using R1 = mp_push_front&lt;L1, float&gt;; // std::tuple&lt;float, double, long double&gt;</code></pre>
  1715. </div>
  1716. </div>
  1717. <div class="listingblock">
  1718. <div class="title">Code Example 20. Using mp_push_front with mp_list</div>
  1719. <div class="content">
  1720. <pre class="highlight"><code>using L2 = mp_list&lt;void&gt;;
  1721. using R2 = mp_push_front&lt;L2, char[1], char[2]&gt;; // mp_list&lt;char[1], char[2], void&gt;</code></pre>
  1722. </div>
  1723. </div>
  1724. </div>
  1725. <div class="sect3">
  1726. <h4 id="mp_push_backl_t">mp_push_back&lt;L, T&#8230;&#8203;&gt;</h4>
  1727. <div class="literalblock">
  1728. <div class="content">
  1729. <pre>template&lt;class L, class... T&gt; using mp_push_back = /*...*/;</pre>
  1730. </div>
  1731. </div>
  1732. <div class="paragraph">
  1733. <p><code>mp_push_back&lt;L, T&#8230;&#8203;&gt;</code> inserts the elements <code>T&#8230;&#8203;</code> at the back of the list <code>L</code>. That is, <code>mp_push_back&lt;L&lt;U&#8230;&#8203;&gt;, T&#8230;&#8203;&gt;</code>
  1734. is an alias for <code>L&lt;U&#8230;&#8203;, T&#8230;&#8203;&gt;</code>.</p>
  1735. </div>
  1736. <div class="listingblock">
  1737. <div class="title">Code Example 21. Using mp_push_back with std::tuple</div>
  1738. <div class="content">
  1739. <pre class="highlight"><code>using L1 = std::tuple&lt;double, long double&gt;;
  1740. using R1 = mp_push_back&lt;L1, float&gt;; // std::tuple&lt;double, long double, float&gt;</code></pre>
  1741. </div>
  1742. </div>
  1743. <div class="listingblock">
  1744. <div class="title">Code Example 22. Using mp_push_back with mp_list</div>
  1745. <div class="content">
  1746. <pre class="highlight"><code>using L2 = mp_list&lt;void&gt;;
  1747. using R2 = mp_push_back&lt;L2, char[1], char[2]&gt;; // mp_list&lt;void, char[1], char[2]&gt;</code></pre>
  1748. </div>
  1749. </div>
  1750. </div>
  1751. <div class="sect3">
  1752. <h4 id="mp_renamel_y">mp_rename&lt;L, Y&gt;</h4>
  1753. <div class="literalblock">
  1754. <div class="content">
  1755. <pre>template&lt;class L, template&lt;class...&gt; class Y&gt; using mp_rename = /*...*/;</pre>
  1756. </div>
  1757. </div>
  1758. <div class="paragraph">
  1759. <p><code>mp_rename&lt;L, Y&gt;</code> changes the type of the list <code>L</code> to <code>Y</code>. That is, <code>mp_rename&lt;L&lt;T&#8230;&#8203;&gt;, Y&gt;</code> is an alias for <code>Y&lt;T&#8230;&#8203;&gt;</code>.</p>
  1760. </div>
  1761. <div class="listingblock">
  1762. <div class="title">Code Example 23. Using mp_rename to rename std::pair to std::tuple</div>
  1763. <div class="content">
  1764. <pre class="highlight"><code>using L1 = std::pair&lt;double, long double&gt;;
  1765. using R1 = mp_rename&lt;L1, std::tuple&gt;; // std::tuple&lt;double, long double&gt;</code></pre>
  1766. </div>
  1767. </div>
  1768. <div class="listingblock">
  1769. <div class="title">Code Example 24. Using mp_rename to rename std::tuple to mp_list</div>
  1770. <div class="content">
  1771. <pre class="highlight"><code>using L2 = std::tuple&lt;void&gt;;
  1772. using R2 = mp_rename&lt;L2, mp_list&gt;; // mp_list&lt;void&gt;</code></pre>
  1773. </div>
  1774. </div>
  1775. </div>
  1776. <div class="sect3">
  1777. <h4 id="mp_applyf_l">mp_apply&lt;F, L&gt;</h4>
  1778. <div class="literalblock">
  1779. <div class="content">
  1780. <pre>template&lt;template&lt;class...&gt; class F, class L&gt; using mp_apply = mp_rename&lt;L, F&gt;;</pre>
  1781. </div>
  1782. </div>
  1783. <div class="paragraph">
  1784. <p><code>mp_apply&lt;F, L&gt;</code> applies the metafunction <code>F</code> to the contents of the list <code>L</code>, that is, <code>mp_apply&lt;F, L&lt;T&#8230;&#8203;&gt;&gt;</code> is an alias for <code>F&lt;T&#8230;&#8203;&gt;</code>.
  1785. (<code>mp_apply</code> is the same as <code>mp_rename</code> with the arguments reversed.)</p>
  1786. </div>
  1787. <div class="listingblock">
  1788. <div class="title">Code Example 25. Using mp_apply with std::pair</div>
  1789. <div class="content">
  1790. <pre class="highlight"><code>using L1 = std::pair&lt;double, long double&gt;;
  1791. using R1 = mp_apply&lt;std::is_same, L1&gt;; // std::is_same&lt;double, long double&gt;</code></pre>
  1792. </div>
  1793. </div>
  1794. </div>
  1795. <div class="sect3">
  1796. <h4 id="mp_apply_qq_l">mp_apply_q&lt;Q, L&gt;</h4>
  1797. <div class="literalblock">
  1798. <div class="content">
  1799. <pre>template&lt;class Q, class L&gt; using mp_apply_q = mp_apply&lt;Q::template fn, L&gt;;</pre>
  1800. </div>
  1801. </div>
  1802. <div class="paragraph">
  1803. <p>Same as <code>mp_apply</code>, but takes a quoted metafunction.</p>
  1804. </div>
  1805. <div class="listingblock">
  1806. <div class="title">Code Example 26. Using mp_apply_q with mp_bind_front</div>
  1807. <div class="content">
  1808. <pre class="highlight"><code>using L1 = std::tuple&lt;double, long double&gt;;
  1809. using L2 = mp_list&lt;int, long&gt;;
  1810. using R1 = mp_apply_q&lt;mp_bind_front&lt;mp_push_back, L1&gt;, L2&gt;;
  1811. // R1 is std::tuple&lt;double, long double, int, long&gt;</code></pre>
  1812. </div>
  1813. </div>
  1814. </div>
  1815. <div class="sect3">
  1816. <h4 id="mp_appendl">mp_append&lt;L&#8230;&#8203;&gt;</h4>
  1817. <div class="literalblock">
  1818. <div class="content">
  1819. <pre>template&lt;class... L&gt; using mp_append = /*...*/;</pre>
  1820. </div>
  1821. </div>
  1822. <div class="paragraph">
  1823. <p><code>mp_append&lt;L&#8230;&#8203;&gt;</code> concatenates the lists in <code>L&#8230;&#8203;</code> into a single list that has the same type as the first list. <code>mp_append&lt;&gt;</code>
  1824. is an alias for <code>mp_list&lt;&gt;</code>. <code>mp_append&lt;L1&lt;T1&#8230;&#8203;&gt;, L2&lt;T2&#8230;&#8203;&gt;, &#8230;&#8203;, Ln&lt;Tn&#8230;&#8203;&gt;&gt;</code> is an alias for <code>L1&lt;T1&#8230;&#8203;, T2&#8230;&#8203;, &#8230;&#8203;, Tn&#8230;&#8203;&gt;</code>.</p>
  1825. </div>
  1826. <div class="listingblock">
  1827. <div class="title">Code Example 27. Using mp_append with lists of various types</div>
  1828. <div class="content">
  1829. <pre class="highlight"><code>using L1 = std::tuple&lt;double, long double&gt;;
  1830. using L2 = mp_list&lt;int&gt;;
  1831. using L3 = std::pair&lt;short, long&gt;;
  1832. using L4 = mp_list&lt;&gt;;
  1833. using R1 = mp_append&lt;L1, L2, L3, L4&gt;;
  1834. // std::tuple&lt;double, long double, int, short, long&gt;</code></pre>
  1835. </div>
  1836. </div>
  1837. </div>
  1838. <div class="sect3">
  1839. <h4 id="mp_replace_frontl_t">mp_replace_front&lt;L, T&gt;</h4>
  1840. <div class="literalblock">
  1841. <div class="content">
  1842. <pre>template&lt;class L, class T&gt; using mp_replace_front = /*...*/;</pre>
  1843. </div>
  1844. </div>
  1845. <div class="paragraph">
  1846. <p><code>mp_replace_front&lt;L, T&gt;</code> replaces the first element of the list <code>L</code> with <code>T</code>. That is, <code>mp_replace_front&lt;L&lt;U1, U&#8230;&#8203;&gt;, T&gt;</code> is
  1847. an alias for <code>L&lt;T, U&#8230;&#8203;&gt;</code>.</p>
  1848. </div>
  1849. <div class="listingblock">
  1850. <div class="title">Code Example 28. Using mp_replace_front with std::pair</div>
  1851. <div class="content">
  1852. <pre class="highlight"><code>using L1 = std::pair&lt;int, float&gt;;
  1853. using R1 = mp_replace_front&lt;L1, void&gt;; // std::pair&lt;void, float&gt;</code></pre>
  1854. </div>
  1855. </div>
  1856. <div class="listingblock">
  1857. <div class="title">Code Example 29. Using mp_replace_front with std::tuple</div>
  1858. <div class="content">
  1859. <pre class="highlight"><code>using L2 = std::tuple&lt;float, double, long double&gt;;
  1860. using R2 = mp_replace_front&lt;L2, void&gt;; // std::tuple&lt;void, double, long double&gt;</code></pre>
  1861. </div>
  1862. </div>
  1863. <div class="listingblock">
  1864. <div class="title">Code Example 30. Using mp_replace_front with mp_list</div>
  1865. <div class="content">
  1866. <pre class="highlight"><code>using L3 = mp_list&lt;char[1], char[2], char[3], char[4]&gt;;
  1867. using R3 = mp_replace_front&lt;L3, void&gt;; // mp_list&lt;void, char[2], char[3], char[4]&gt;;</code></pre>
  1868. </div>
  1869. </div>
  1870. </div>
  1871. <div class="sect3">
  1872. <h4 id="mp_replace_firstl_t">mp_replace_first&lt;L, T&gt;</h4>
  1873. <div class="literalblock">
  1874. <div class="content">
  1875. <pre>template&lt;class L, class T&gt; using mp_replace_first = mp_replace_front&lt;L, T&gt;;</pre>
  1876. </div>
  1877. </div>
  1878. <div class="paragraph">
  1879. <p><code>mp_replace_first</code> is another name for <code>mp_replace_front</code>.</p>
  1880. </div>
  1881. </div>
  1882. <div class="sect3">
  1883. <h4 id="mp_replace_secondl_t">mp_replace_second&lt;L, T&gt;</h4>
  1884. <div class="literalblock">
  1885. <div class="content">
  1886. <pre>template&lt;class L, class T&gt; using mp_replace_second = /*...*/;</pre>
  1887. </div>
  1888. </div>
  1889. <div class="paragraph">
  1890. <p><code>mp_replace_second&lt;L, T&gt;</code> replaces the second element of the list <code>L</code> with <code>T</code>. That is, <code>mp_replace_second&lt;L&lt;U1, U2, U&#8230;&#8203;&gt;, T&gt;</code>
  1891. is an alias for <code>L&lt;U1, T, U&#8230;&#8203;&gt;</code>.</p>
  1892. </div>
  1893. <div class="listingblock">
  1894. <div class="title">Code Example 31. Using mp_replace_second with std::pair</div>
  1895. <div class="content">
  1896. <pre class="highlight"><code>using L1 = std::pair&lt;int, float&gt;;
  1897. using R1 = mp_replace_second&lt;L1, void&gt;; // std::pair&lt;int, void&gt;</code></pre>
  1898. </div>
  1899. </div>
  1900. <div class="listingblock">
  1901. <div class="title">Code Example 32. Using mp_replace_second with std::tuple</div>
  1902. <div class="content">
  1903. <pre class="highlight"><code>using L2 = std::tuple&lt;float, double, long double&gt;;
  1904. using R2 = mp_replace_second&lt;L2, void&gt;; // std::tuple&lt;float, void, long double&gt;</code></pre>
  1905. </div>
  1906. </div>
  1907. <div class="listingblock">
  1908. <div class="title">Code Example 33. Using mp_replace_front with mp_list</div>
  1909. <div class="content">
  1910. <pre class="highlight"><code>using L3 = mp_list&lt;char[1], char[2], char[3], char[4]&gt;;
  1911. using R3 = mp_replace_second&lt;L3, void&gt;; // mp_list&lt;char[1], void, char[3], char[4]&gt;;</code></pre>
  1912. </div>
  1913. </div>
  1914. </div>
  1915. <div class="sect3">
  1916. <h4 id="mp_replace_thirdl_t">mp_replace_third&lt;L, T&gt;</h4>
  1917. <div class="literalblock">
  1918. <div class="content">
  1919. <pre>template&lt;class L, class T&gt; using mp_replace_third = /*...*/;</pre>
  1920. </div>
  1921. </div>
  1922. <div class="paragraph">
  1923. <p><code>mp_replace_third&lt;L, T&gt;</code> replaces the third element of the list <code>L</code> with <code>T</code>. That is, <code>mp_replace_third&lt;L&lt;U1, U2, U3, U&#8230;&#8203;&gt;, T&gt;</code>
  1924. is an alias for <code>L&lt;U1, U2, T, U&#8230;&#8203;&gt;</code>.</p>
  1925. </div>
  1926. <div class="listingblock">
  1927. <div class="title">Code Example 34. Using mp_replace_third with std::tuple</div>
  1928. <div class="content">
  1929. <pre class="highlight"><code>using L1 = std::tuple&lt;float, double, long double&gt;;
  1930. using R1 = mp_replace_third&lt;L1, void&gt;; // std::tuple&lt;float, double, void&gt;</code></pre>
  1931. </div>
  1932. </div>
  1933. <div class="listingblock">
  1934. <div class="title">Code Example 35. Using mp_replace_third with mp_list</div>
  1935. <div class="content">
  1936. <pre class="highlight"><code>using L2 = mp_list&lt;char[1], char[2], char[3], char[4]&gt;;
  1937. using R2 = mp_replace_third&lt;L2, void&gt;; // mp_list&lt;char[1], char[2], void, char[4]&gt;;</code></pre>
  1938. </div>
  1939. </div>
  1940. </div>
  1941. <div class="sect3">
  1942. <h4 id="mp_transform_frontl_f">mp_transform_front&lt;L, F&gt;</h4>
  1943. <div class="literalblock">
  1944. <div class="content">
  1945. <pre>template&lt;class L, template&lt;class...&gt; class F&gt; using mp_transform_front =
  1946. /*...*/;</pre>
  1947. </div>
  1948. </div>
  1949. <div class="paragraph">
  1950. <p><code>mp_transform_front&lt;L, F&gt;</code> replaces the first element <code>T1</code> of the list <code>L</code> with <code>F&lt;T1&gt;</code>.</p>
  1951. </div>
  1952. </div>
  1953. <div class="sect3">
  1954. <h4 id="mp_transform_front_ql_q">mp_transform_front_q&lt;L, Q&gt;</h4>
  1955. <div class="literalblock">
  1956. <div class="content">
  1957. <pre>template&lt;class L, class Q&gt; using mp_transform_front_q =
  1958. mp_transform_front&lt;L, Q::template fn&gt;;</pre>
  1959. </div>
  1960. </div>
  1961. <div class="paragraph">
  1962. <p>As <code>mp_transform_front</code>, but takes a quoted metafunction.</p>
  1963. </div>
  1964. </div>
  1965. <div class="sect3">
  1966. <h4 id="mp_transform_firstl_f">mp_transform_first&lt;L, F&gt;</h4>
  1967. <div class="literalblock">
  1968. <div class="content">
  1969. <pre>template&lt;class L, template&lt;class...&gt; class F&gt; using mp_transform_first =
  1970. mp_transform_front&lt;L, F&gt;;</pre>
  1971. </div>
  1972. </div>
  1973. <div class="paragraph">
  1974. <p><code>mp_transform_first</code> is another name for <code>mp_transform_front</code>.</p>
  1975. </div>
  1976. </div>
  1977. <div class="sect3">
  1978. <h4 id="mp_transform_first_ql_q">mp_transform_first_q&lt;L, Q&gt;</h4>
  1979. <div class="literalblock">
  1980. <div class="content">
  1981. <pre>template&lt;class L, class Q&gt; using mp_transform_first_q =
  1982. mp_transform_first&lt;L, Q::template fn&gt;;</pre>
  1983. </div>
  1984. </div>
  1985. <div class="paragraph">
  1986. <p>As <code>mp_transform_first</code>, but takes a quoted metafunction.</p>
  1987. </div>
  1988. </div>
  1989. <div class="sect3">
  1990. <h4 id="mp_transform_secondl_f">mp_transform_second&lt;L, F&gt;</h4>
  1991. <div class="literalblock">
  1992. <div class="content">
  1993. <pre>template&lt;class L, template&lt;class...&gt; class F&gt; using mp_transform_second =
  1994. /*...*/;</pre>
  1995. </div>
  1996. </div>
  1997. <div class="paragraph">
  1998. <p><code>mp_transform_second&lt;L, F&gt;</code> replaces the second element <code>T2</code> of the list <code>L</code> with <code>F&lt;T2&gt;</code>.</p>
  1999. </div>
  2000. </div>
  2001. <div class="sect3">
  2002. <h4 id="mp_transform_second_ql_q">mp_transform_second_q&lt;L, Q&gt;</h4>
  2003. <div class="literalblock">
  2004. <div class="content">
  2005. <pre>template&lt;class L, class Q&gt; using mp_transform_second_q =
  2006. mp_transform_second&lt;L, Q::template fn&gt;;</pre>
  2007. </div>
  2008. </div>
  2009. <div class="paragraph">
  2010. <p>As <code>mp_transform_second</code>, but takes a quoted metafunction.</p>
  2011. </div>
  2012. </div>
  2013. <div class="sect3">
  2014. <h4 id="mp_transform_thirdl_f">mp_transform_third&lt;L, F&gt;</h4>
  2015. <div class="literalblock">
  2016. <div class="content">
  2017. <pre>template&lt;class L, template&lt;class...&gt; class F&gt; using mp_transform_third =
  2018. /*...*/;</pre>
  2019. </div>
  2020. </div>
  2021. <div class="paragraph">
  2022. <p><code>mp_transform_third&lt;L, F&gt;</code> replaces the third element <code>T3</code> of the list <code>L</code> with <code>F&lt;T3&gt;</code>.</p>
  2023. </div>
  2024. </div>
  2025. <div class="sect3">
  2026. <h4 id="mp_transform_third_ql_q">mp_transform_third_q&lt;L, Q&gt;</h4>
  2027. <div class="literalblock">
  2028. <div class="content">
  2029. <pre>template&lt;class L, class Q&gt; using mp_transform_third_q =
  2030. mp_transform_third&lt;L, Q::template fn&gt;;</pre>
  2031. </div>
  2032. </div>
  2033. <div class="paragraph">
  2034. <p>As <code>mp_transform_third</code>, but takes a quoted metafunction.</p>
  2035. </div>
  2036. </div>
  2037. </div>
  2038. <div class="sect2">
  2039. <h3 id="utility">Utility Components, &lt;boost/mp11/utility.hpp&gt;</h3>
  2040. <div class="sect3">
  2041. <h4 id="mp_identityt">mp_identity&lt;T&gt;</h4>
  2042. <div class="literalblock">
  2043. <div class="content">
  2044. <pre>template&lt;class T&gt; struct mp_identity
  2045. {
  2046. using type = T;
  2047. };</pre>
  2048. </div>
  2049. </div>
  2050. <div class="paragraph">
  2051. <p><code>mp_identity</code> is a simple <em>transformation type trait</em> (as per the C++ standard)
  2052. that just returns the same type. It&#8217;s useful both as such, and as a type wrapper
  2053. for passing types as values to functions.</p>
  2054. </div>
  2055. <div class="listingblock">
  2056. <div class="title">Code Example 36. Using mp_identity as a type trait</div>
  2057. <div class="content">
  2058. <pre class="highlight"><code>template&lt;class T&gt; using addp_if_not_ref =
  2059. typename mp_if&lt;std::is_reference&lt;T&gt;, mp_identity&lt;T&gt;, std::add_pointer&lt;T&gt;&gt;::type;</code></pre>
  2060. </div>
  2061. </div>
  2062. <div class="listingblock">
  2063. <div class="title">Code Example 37. Using mp_identity to protect qualifiers and references</div>
  2064. <div class="content">
  2065. <pre class="highlight"><code>template&lt;class T&gt; void print1()
  2066. {
  2067. std::cout &lt;&lt; typeid(T).name() &lt;&lt; std::endl;
  2068. }
  2069. template&lt;class T&gt; void print2()
  2070. {
  2071. std::cout &lt;&lt; typeid(mp_identity&lt;T&gt;).name() &lt;&lt; std::endl;
  2072. }
  2073. int main()
  2074. {
  2075. print1&lt;int const&amp;&gt;(); // 'int'
  2076. print2&lt;int const&amp;&gt;(); // 'mp_identity&lt;int const &amp;&gt;'
  2077. }</code></pre>
  2078. </div>
  2079. </div>
  2080. </div>
  2081. <div class="sect3">
  2082. <h4 id="mp_identity_tt">mp_identity_t&lt;T&gt;</h4>
  2083. <div class="literalblock">
  2084. <div class="content">
  2085. <pre>template&lt;class T&gt; using mp_identity_t = typename mp_identity&lt;T&gt;::type;</pre>
  2086. </div>
  2087. </div>
  2088. </div>
  2089. <div class="sect3">
  2090. <h4 id="mp_inheritt">mp_inherit&lt;T&#8230;&#8203;&gt;</h4>
  2091. <div class="literalblock">
  2092. <div class="content">
  2093. <pre>template&lt;class... T&gt; struct mp_inherit: T... {};</pre>
  2094. </div>
  2095. </div>
  2096. </div>
  2097. <div class="sect3">
  2098. <h4 id="mp_if_cc_t_e">mp_if_c&lt;C, T, E&#8230;&#8203;&gt;</h4>
  2099. <div class="literalblock">
  2100. <div class="content">
  2101. <pre>template&lt;bool C, class T, class... E&gt; using mp_if_c = /*...*/;</pre>
  2102. </div>
  2103. </div>
  2104. <div class="paragraph">
  2105. <p><code>mp_if_c&lt;true, T, E&#8230;&#8203;&gt;</code> is an alias for <code>T</code>. <code>mp_if_c&lt;false, T, E&gt;</code> is an alias for <code>E</code>. Otherwise, the result is a substitution failure.</p>
  2106. </div>
  2107. <div class="listingblock">
  2108. <div class="title">Code Example 38. Using mp_if_c to select between two alternatives</div>
  2109. <div class="content">
  2110. <pre class="highlight"><code>using R1 = mp_if_c&lt;true, int, void&gt;; // int
  2111. using R2 = mp_if_c&lt;false, int, void&gt;; // void</code></pre>
  2112. </div>
  2113. </div>
  2114. <div class="listingblock">
  2115. <div class="title">Code Example 39. Using mp_if_c to fail substitution when a condition is not met</div>
  2116. <div class="content">
  2117. <pre class="highlight"><code>template&lt;class I&gt; using void_if_5 = mp_if_c&lt;I::value == 5, void&gt;;</code></pre>
  2118. </div>
  2119. </div>
  2120. <div class="paragraph">
  2121. <p>This example returns <code>void</code> when <code>I::value</code> is 5, and generates a substitution failure
  2122. otherwise. It&#8217;s the same as <code>std::enable_if_t&lt;I::value == 5&gt;</code> in C&#43;&#43;14, or
  2123. <code>typename std::enable_if&lt;I::value == 5&gt;::type</code> in C&#43;&#43;11.</p>
  2124. </div>
  2125. </div>
  2126. <div class="sect3">
  2127. <h4 id="mp_ifc_t_e">mp_if&lt;C, T, E&#8230;&#8203;&gt;</h4>
  2128. <div class="literalblock">
  2129. <div class="content">
  2130. <pre>template&lt;class C, class T, class... E&gt; using mp_if =
  2131. mp_if_c&lt;static_cast&lt;bool&gt;(C::value), T, E...&gt;;</pre>
  2132. </div>
  2133. </div>
  2134. <div class="paragraph">
  2135. <p>Like <code>mp_if_c</code>, but the first argument is a type.</p>
  2136. </div>
  2137. <div class="listingblock">
  2138. <div class="title">Code Example 40. Using mp_if to select between two alternatives</div>
  2139. <div class="content">
  2140. <pre class="highlight"><code>using R1 = mp_if&lt;mp_true, int, void&gt;; // int
  2141. using R2 = mp_if&lt;mp_false, int, void&gt;; // void</code></pre>
  2142. </div>
  2143. </div>
  2144. <div class="listingblock">
  2145. <div class="title">Code Example 41. Using mp_if to fail substitution when a condition is not met</div>
  2146. <div class="content">
  2147. <pre class="highlight"><code>template&lt;class T&gt; using void_if_const = mp_if&lt;std::is_const&lt;T&gt;, void&gt;;
  2148. template&lt;class... T&gt; using void_if_all_const =
  2149. mp_if&lt;mp_all&lt;std::is_const&lt;T&gt;...&gt;, void&gt;;
  2150. template&lt;class T&gt; using if_non_const = mp_if&lt;mp_not&lt;std::is_const&lt;T&gt;&gt;, T&gt;;</code></pre>
  2151. </div>
  2152. </div>
  2153. </div>
  2154. <div class="sect3">
  2155. <h4 id="mp_eval_if_cc_t_f_u">mp_eval_if_c&lt;C, T, F, U&#8230;&#8203;&gt;</h4>
  2156. <div class="literalblock">
  2157. <div class="content">
  2158. <pre>template&lt;bool C, class T, template&lt;class...&gt; class F, class... U&gt; using mp_eval_if_c =
  2159. /*...*/;</pre>
  2160. </div>
  2161. </div>
  2162. <div class="paragraph">
  2163. <p><code>mp_eval_if_c&lt;C, T, F, U&#8230;&#8203;&gt;</code> is an alias for <code>T</code> when <code>C</code> is <code>true</code>, for <code>F&lt;U&#8230;&#8203;&gt;</code> otherwise. Its purpose
  2164. is to avoid evaluating <code>F&lt;U&#8230;&#8203;&gt;</code> when the condition is <code>true</code> as it may not be valid in this case.</p>
  2165. </div>
  2166. <div class="listingblock">
  2167. <div class="title">Code Example 42. Using mp_eval_if_c to select the first pack element, or void</div>
  2168. <div class="content">
  2169. <pre class="highlight"><code>template&lt;class... T&gt; using first_or_void =
  2170. mp_eval_if_c&lt;sizeof...(T) == 0, void, mp_apply, mp_first, mp_list&lt;T...&gt;&gt;;</code></pre>
  2171. </div>
  2172. </div>
  2173. </div>
  2174. <div class="sect3">
  2175. <h4 id="mp_eval_ifc_t_f_u">mp_eval_if&lt;C, T, F, U&#8230;&#8203;&gt;</h4>
  2176. <div class="literalblock">
  2177. <div class="content">
  2178. <pre>template&lt;class C, class T, template&lt;class...&gt; class F, class... U&gt; using mp_eval_if =
  2179. mp_eval_if_c&lt;static_cast&lt;bool&gt;(C::value), T, F, U...&gt;;</pre>
  2180. </div>
  2181. </div>
  2182. <div class="paragraph">
  2183. <p>Like <code>mp_eval_if_c</code>, but the first argument is a type.</p>
  2184. </div>
  2185. <div class="listingblock">
  2186. <div class="title">Code Example 43. Using mp_eval_if to select the first list element, or void</div>
  2187. <div class="content">
  2188. <pre class="highlight"><code>template&lt;class L&gt; using first_or_void = mp_eval_if&lt;mp_empty&lt;L&gt;, void, mp_first, L&gt;;</code></pre>
  2189. </div>
  2190. </div>
  2191. </div>
  2192. <div class="sect3">
  2193. <h4 id="mp_eval_if_qc_t_q_u">mp_eval_if_q&lt;C, T, Q, U&#8230;&#8203;&gt;</h4>
  2194. <div class="literalblock">
  2195. <div class="content">
  2196. <pre>template&lt;class C, class T, class Q, class... U&gt; using mp_eval_if_q =
  2197. mp_eval_if&lt;C, T, Q::template fn, U...&gt;;</pre>
  2198. </div>
  2199. </div>
  2200. <div class="paragraph">
  2201. <p>Like <code>mp_eval_if</code>, but takes a quoted metafunction.</p>
  2202. </div>
  2203. </div>
  2204. <div class="sect3">
  2205. <h4 id="mp_eval_if_notc_t_f_u">mp_eval_if_not&lt;C, T, F, U&#8230;&#8203;&gt;</h4>
  2206. <div class="literalblock">
  2207. <div class="content">
  2208. <pre>template&lt;class C, class T, template&lt;class...&gt; class F, class... U&gt;
  2209. using mp_eval_if_not = mp_eval_if&lt;mp_not&lt;C&gt;, T, F, U...&gt;;</pre>
  2210. </div>
  2211. </div>
  2212. <div class="paragraph">
  2213. <p>Same as <code>mp_eval_if</code>, but the condition is reversed.</p>
  2214. </div>
  2215. </div>
  2216. <div class="sect3">
  2217. <h4 id="mp_eval_if_not_qc_t_q_u">mp_eval_if_not_q&lt;C, T, Q, U&#8230;&#8203;&gt;</h4>
  2218. <div class="literalblock">
  2219. <div class="content">
  2220. <pre>template&lt;class C, class T, class Q, class... U&gt; using mp_eval_if_not_q =
  2221. mp_eval_if_not&lt;C, T, Q::template fn, U...&gt;;</pre>
  2222. </div>
  2223. </div>
  2224. <div class="paragraph">
  2225. <p>Same as <code>mp_eval_if_not</code>, but takes a quoted metafunction.</p>
  2226. </div>
  2227. </div>
  2228. <div class="sect3">
  2229. <h4 id="mp_validf_t">mp_valid&lt;F, T&#8230;&#8203;&gt;</h4>
  2230. <div class="literalblock">
  2231. <div class="content">
  2232. <pre>template&lt;template&lt;class...&gt; class F, class... T&gt; using mp_valid = /*...*/;</pre>
  2233. </div>
  2234. </div>
  2235. <div class="paragraph">
  2236. <p><code>mp_valid&lt;F, T&#8230;&#8203;&gt;</code> is an alias for <code>mp_true</code> when <code>F&lt;T&#8230;&#8203;&gt;</code> is a valid expression, for <code>mp_false</code> otherwise.</p>
  2237. </div>
  2238. <div class="listingblock">
  2239. <div class="title">Code Example 44. Using mp_valid to write a metafunction that checks for the existence of a nested type</div>
  2240. <div class="content">
  2241. <pre class="highlight"><code>template&lt;class T&gt; using get_nested_type = typename T::type;
  2242. template&lt;class T&gt; struct has_nested_type: mp_valid&lt;get_nested_type, T&gt; {};</code></pre>
  2243. </div>
  2244. </div>
  2245. </div>
  2246. <div class="sect3">
  2247. <h4 id="mp_valid_qq_t">mp_valid_q&lt;Q, T&#8230;&#8203;&gt;</h4>
  2248. <div class="literalblock">
  2249. <div class="content">
  2250. <pre>template&lt;class Q, class... T&gt; using mp_valid_q = mp_valid&lt;Q::template fn, T...&gt;;</pre>
  2251. </div>
  2252. </div>
  2253. <div class="paragraph">
  2254. <p>Like <code>mp_valid</code>, but takes a quoted metafunction.</p>
  2255. </div>
  2256. </div>
  2257. <div class="sect3">
  2258. <h4 id="mp_eval_ort_f_u">mp_eval_or&lt;T, F, U&#8230;&#8203;&gt;</h4>
  2259. <div class="literalblock">
  2260. <div class="content">
  2261. <pre>template&lt;class T, template&lt;class...&gt; class F, class... U&gt; using mp_eval_or =
  2262. mp_eval_if_not&lt;mp_valid&lt;F, U...&gt;, T, F, U...&gt;;</pre>
  2263. </div>
  2264. </div>
  2265. <div class="paragraph">
  2266. <p><code>mp_eval_or&lt;T, F, U&#8230;&#8203;&gt;</code> is an alias for <code>F&lt;U&#8230;&#8203;&gt;</code> when this expression is valid, for <code>T</code> otherwise.</p>
  2267. </div>
  2268. </div>
  2269. <div class="sect3">
  2270. <h4 id="mp_eval_or_qt_q_u">mp_eval_or_q&lt;T, Q, U&#8230;&#8203;&gt;</h4>
  2271. <div class="literalblock">
  2272. <div class="content">
  2273. <pre>template&lt;class T, class Q, class... U&gt; using mp_eval_or_q =
  2274. mp_eval_or&lt;T, Q::template fn, U...&gt;;</pre>
  2275. </div>
  2276. </div>
  2277. <div class="paragraph">
  2278. <p>Like <code>mp_eval_or</code>, but takes a quoted metafunction.</p>
  2279. </div>
  2280. </div>
  2281. <div class="sect3">
  2282. <h4 id="mp_condc_t_r">mp_cond&lt;C, T, R&#8230;&#8203;&gt;</h4>
  2283. <div class="literalblock">
  2284. <div class="content">
  2285. <pre>template&lt;class C, class T, class... R&gt; using mp_cond = /*...*/;</pre>
  2286. </div>
  2287. </div>
  2288. <div class="paragraph">
  2289. <p><code>mp_cond&lt;C, T, R&#8230;&#8203;&gt;</code> is an alias for <code>T</code> when <code>static_cast&lt;bool&gt;(C::value)</code> is <code>true</code>.
  2290. When <code>static_cast&lt;bool&gt;(C::value)</code> is <code>false</code>, it&#8217;s an alias for <code>mp_cond&lt;R&#8230;&#8203;&gt;</code>.</p>
  2291. </div>
  2292. <div class="paragraph">
  2293. <p>(If <code>static_cast&lt;bool&gt;(C::value)</code> is a substitution failure, the result is too a substitution
  2294. failure.)</p>
  2295. </div>
  2296. <div class="listingblock">
  2297. <div class="title">Code Example 45. Using mp_cond</div>
  2298. <div class="content">
  2299. <pre class="highlight"><code>template&lt;int N&gt; using unsigned_ = mp_cond&lt;
  2300. mp_bool&lt;N == 8&gt;, uint8_t,
  2301. mp_bool&lt;N == 16&gt;, uint16_t,
  2302. mp_bool&lt;N == 32&gt;, uint32_t,
  2303. mp_bool&lt;N == 64&gt;, uint64_t,
  2304. mp_true, unsigned // default case
  2305. &gt;;</code></pre>
  2306. </div>
  2307. </div>
  2308. </div>
  2309. <div class="sect3">
  2310. <h4 id="mp_deferf_t">mp_defer&lt;F, T&#8230;&#8203;&gt;</h4>
  2311. <div class="literalblock">
  2312. <div class="content">
  2313. <pre>template&lt;template&lt;class...&gt; class F, class... T&gt; using mp_defer = /*...*/;</pre>
  2314. </div>
  2315. </div>
  2316. <div class="paragraph">
  2317. <p>When <code>mp_valid&lt;F, T&#8230;&#8203;&gt;</code> is <code>mp_true</code>, <code>mp_defer&lt;F, T&#8230;&#8203;&gt;</code> is a struct with a nested type <code>type</code> which is an alias for <code>F&lt;T&#8230;&#8203;&gt;</code>. Otherwise,
  2318. <code>mp_defer&lt;F, T&#8230;&#8203;&gt;</code> is an empty struct.</p>
  2319. </div>
  2320. </div>
  2321. <div class="sect3">
  2322. <h4 id="mp_quotef">mp_quote&lt;F&gt;</h4>
  2323. <div class="literalblock">
  2324. <div class="content">
  2325. <pre>template&lt;template&lt;class...&gt; class F&gt; struct mp_quote
  2326. {
  2327. template&lt;class... T&gt; using fn = F&lt;T...&gt;;
  2328. };</pre>
  2329. </div>
  2330. </div>
  2331. <div class="paragraph">
  2332. <p><code>mp_quote&lt;F&gt;</code> transforms the template <code>F</code> into a <em>quoted metafunction</em>, a type with a nested template <code>fn</code> such that <code>fn&lt;T&#8230;&#8203;&gt;</code> returns <code>F&lt;T&#8230;&#8203;&gt;</code>.</p>
  2333. </div>
  2334. <div class="listingblock">
  2335. <div class="title">Code Example 46. Using mp_quote to make a list of metafunctions</div>
  2336. <div class="content">
  2337. <pre class="highlight"><code>using LQ = mp_list&lt;mp_quote&lt;std::is_const&gt;, mp_quote&lt;std::is_volatile&gt;&gt;;</code></pre>
  2338. </div>
  2339. </div>
  2340. </div>
  2341. <div class="sect3">
  2342. <h4 id="mp_quote_traitf">mp_quote_trait&lt;F&gt;</h4>
  2343. <div class="literalblock">
  2344. <div class="content">
  2345. <pre>template&lt;template&lt;class...&gt; class F&gt; struct mp_quote_trait
  2346. {
  2347. template&lt;class... T&gt; using fn = typename F&lt;T...&gt;::type;
  2348. };</pre>
  2349. </div>
  2350. </div>
  2351. <div class="paragraph">
  2352. <p><code>mp_quote_trait&lt;F&gt;</code> transforms the C++03-style trait <code>F</code> into a quoted metafunction.</p>
  2353. </div>
  2354. <div class="listingblock">
  2355. <div class="title">Code Example 47. Using mp_quote_trait with std::add_pointer</div>
  2356. <div class="content">
  2357. <pre class="highlight"><code>using L1 = mp_list&lt;int, void, float&gt;;
  2358. using R1 = mp_transform_q&lt;mp_quote_trait&lt;std::add_pointer&gt;, L1&gt;;
  2359. // mp_list&lt;int*, void*, float*&gt;</code></pre>
  2360. </div>
  2361. </div>
  2362. </div>
  2363. <div class="sect3">
  2364. <h4 id="mp_invoke_qq_t">mp_invoke_q&lt;Q, T&#8230;&#8203;&gt;</h4>
  2365. <div class="literalblock">
  2366. <div class="content">
  2367. <pre>template&lt;class Q, class... T&gt; using mp_invoke_q = typename Q::template fn&lt;T...&gt;;</pre>
  2368. </div>
  2369. </div>
  2370. <div class="paragraph">
  2371. <p><code>mp_invoke_q&lt;Q, T&#8230;&#8203;&gt;</code> evaluates the nested template <code>fn</code> of a quoted metafunction. <code>mp_invoke_q&lt;mp_quote&lt;F&gt;, T&#8230;&#8203;&gt;</code> returns <code>F&lt;T&#8230;&#8203;&gt;</code>.</p>
  2372. </div>
  2373. <div class="listingblock">
  2374. <div class="title">Code Example 48. Using mp_invoke_q to invoke a list of metafunctions, technique 1</div>
  2375. <div class="content">
  2376. <pre class="highlight"><code>using LQ = mp_list&lt;mp_quote&lt;std::is_const&gt;, mp_quote&lt;std::is_volatile&gt;&gt;;
  2377. template&lt;class T&gt; using is_const_and_volatile =
  2378. mp_all&lt;mp_product&lt;mp_invoke_q, LQ, mp_list&lt;T&gt;&gt;&gt;;</code></pre>
  2379. </div>
  2380. </div>
  2381. <div class="listingblock">
  2382. <div class="title">Code Example 49. Using mp_invoke_q to invoke a list of metafunctions, technique 2</div>
  2383. <div class="content">
  2384. <pre class="highlight"><code>template&lt;class T&gt; using is_const_and_volatile =
  2385. mp_all&lt;mp_transform_q&lt;mp_bind_back&lt;mp_invoke_q, T&gt;, LQ&gt;&gt;;</code></pre>
  2386. </div>
  2387. </div>
  2388. <div class="listingblock">
  2389. <div class="title">Code Example 50. Using mp_invoke_q to invoke a list of metafunctions, technique 3</div>
  2390. <div class="content">
  2391. <pre class="highlight"><code>template&lt;class T&gt; using is_const_and_volatile =
  2392. mp_all&lt;mp_transform&lt;mp_invoke_q, LQ, mp_fill&lt;LQ, T&gt;&gt;&gt;;</code></pre>
  2393. </div>
  2394. </div>
  2395. </div>
  2396. <div class="sect3">
  2397. <h4 id="mp_not_fnp">mp_not_fn&lt;P&gt;</h4>
  2398. <div class="literalblock">
  2399. <div class="content">
  2400. <pre>template&lt;template&lt;class...&gt; class P&gt; struct mp_not_fn
  2401. {
  2402. template&lt;class... T&gt; using fn = mp_not&lt;P&lt;T...&gt;&gt;;
  2403. };</pre>
  2404. </div>
  2405. </div>
  2406. <div class="paragraph">
  2407. <p><code>mp_not_fn&lt;P&gt;</code> returns a quoted metafunction <code>Q</code> such that <code>Q::fn&lt;T&#8230;&#8203;&gt;</code> returns <code>mp_not&lt;P&lt;T&#8230;&#8203;&gt;&gt;</code>.</p>
  2408. </div>
  2409. <div class="paragraph">
  2410. <p>That is, it negates the result of <code>P</code>.</p>
  2411. </div>
  2412. </div>
  2413. <div class="sect3">
  2414. <h4 id="mp_not_fn_qq">mp_not_fn_q&lt;Q&gt;</h4>
  2415. <div class="literalblock">
  2416. <div class="content">
  2417. <pre>template&lt;class Q&gt; using mp_not_fn_q = mp_not_fn&lt;Q::template fn&gt;;</pre>
  2418. </div>
  2419. </div>
  2420. <div class="paragraph">
  2421. <p>As <code>mp_not_fn</code>, but takes a quoted metafunction.</p>
  2422. </div>
  2423. </div>
  2424. </div>
  2425. <div class="sect2">
  2426. <h3 id="algorithm">Algorithms, &lt;boost/mp11/algorithm.hpp&gt;</h3>
  2427. <div class="sect3">
  2428. <h4 id="mp_transformf_l">mp_transform&lt;F, L&#8230;&#8203;&gt;</h4>
  2429. <div class="literalblock">
  2430. <div class="content">
  2431. <pre>template&lt;template&lt;class...&gt; class F, class... L&gt; using mp_transform = /*...*/;</pre>
  2432. </div>
  2433. </div>
  2434. <div class="paragraph">
  2435. <p><code>mp_transform&lt;F, L1&lt;T1&#8230;&#8203;&gt;, L2&lt;T2&#8230;&#8203;&gt;, &#8230;&#8203;, Ln&lt;Tn&#8230;&#8203;&gt;&gt;</code> applies <code>F</code> to each successive tuple of elements and returns <code>L1&lt;F&lt;T1, T2, &#8230;&#8203;, Tn&gt;&#8230;&#8203;&gt;</code>.</p>
  2436. </div>
  2437. <div class="listingblock">
  2438. <div class="title">Code Example 51. Using mp_transform to produce a list of pointers from a list of pointees</div>
  2439. <div class="content">
  2440. <pre class="highlight"><code>template&lt;class T&gt; using add_pointer_t =
  2441. typename std::add_pointer&lt;T&gt;::type; // std::add_pointer_t in C++14
  2442. using L1 = std::tuple&lt;void, int, float&gt;;
  2443. using R1 = mp_transform&lt;add_pointer_t, L1&gt;; // std::tuple&lt;void*, int*, float*&gt;</code></pre>
  2444. </div>
  2445. </div>
  2446. <div class="listingblock">
  2447. <div class="title">Code Example 52. Using mp_transform to compare the contents of two lists of types</div>
  2448. <div class="content">
  2449. <pre class="highlight"><code>using L1 = std::tuple&lt;void, int, float&gt;;
  2450. using L2 = mp_list&lt;void, int, float&gt;;
  2451. using R1 = mp_all&lt;mp_transform&lt;std::is_same, L1, L2&gt;&gt;; // mp_true</code></pre>
  2452. </div>
  2453. </div>
  2454. <div class="listingblock">
  2455. <div class="title">Code Example 53. Using mp_transform to compare the contents of two lists of integral constants</div>
  2456. <div class="content">
  2457. <pre class="highlight"><code>template&lt;class T1, class T2&gt; using eq = mp_bool&lt;T1::value == T2::value&gt;;
  2458. using L1 = std::tuple&lt;mp_int&lt;1&gt;, mp_int&lt;2&gt;, mp_int&lt;3&gt;&gt;;
  2459. using L2 = mp_list&lt;mp_size_t&lt;1&gt;, mp_size_t&lt;2&gt;, mp_size_t&lt;3&gt;&gt;;
  2460. using R1 = mp_all&lt;mp_transform&lt;eq, L1, L2&gt;&gt;; // mp_true</code></pre>
  2461. </div>
  2462. </div>
  2463. <table class="tableblock frame-all grid-all" style="width: 85%;">
  2464. <caption class="title">Illustration 1. mp_transform on one list</caption>
  2465. <colgroup>
  2466. <col style="width: 50%;">
  2467. <col style="width: 12.5%;">
  2468. <col style="width: 12.5%;">
  2469. <col style="width: 12.5%;">
  2470. <col style="width: 12.5%;">
  2471. </colgroup>
  2472. <tbody>
  2473. <tr>
  2474. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L1</strong></code></p></td>
  2475. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  2476. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>2</sub></code></p></td>
  2477. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2478. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  2479. </tr>
  2480. <tr>
  2481. <td class="tableblock halign-left valign-middle" colspan="5"></td>
  2482. </tr>
  2483. <tr>
  2484. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>mp_transform&lt;F, L1&gt;</strong></code></p></td>
  2485. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>F&lt;A<sub>1</sub>&gt;</code></p></td>
  2486. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>F&lt;A<sub>2</sub>&gt;</code></p></td>
  2487. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2488. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>F&lt;A<sub>n</sub>&gt;</code></p></td>
  2489. </tr>
  2490. </tbody>
  2491. </table>
  2492. <table class="tableblock frame-all grid-all" style="width: 85%;">
  2493. <caption class="title">Illustration 2. mp_transform on two lists</caption>
  2494. <colgroup>
  2495. <col style="width: 50%;">
  2496. <col style="width: 12.5%;">
  2497. <col style="width: 12.5%;">
  2498. <col style="width: 12.5%;">
  2499. <col style="width: 12.5%;">
  2500. </colgroup>
  2501. <tbody>
  2502. <tr>
  2503. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L1</strong></code></p></td>
  2504. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  2505. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>2</sub></code></p></td>
  2506. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2507. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  2508. </tr>
  2509. <tr>
  2510. <td class="tableblock halign-left valign-middle" colspan="5"></td>
  2511. </tr>
  2512. <tr>
  2513. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L2</strong></code></p></td>
  2514. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>B<sub>1</sub></code></p></td>
  2515. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>B<sub>2</sub></code></p></td>
  2516. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2517. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>B<sub>n</sub></code></p></td>
  2518. </tr>
  2519. <tr>
  2520. <td class="tableblock halign-left valign-middle" colspan="5"></td>
  2521. </tr>
  2522. <tr>
  2523. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>mp_transform&lt;F, L1, L2&gt;</strong></code></p></td>
  2524. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>F&lt;A<sub>1</sub>,B<sub>1</sub>&gt;</code></p></td>
  2525. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>F&lt;A<sub>2</sub>,B<sub>2</sub>&gt;</code></p></td>
  2526. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2527. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>F&lt;A<sub>n</sub>,B<sub>n</sub>&gt;</code></p></td>
  2528. </tr>
  2529. </tbody>
  2530. </table>
  2531. </div>
  2532. <div class="sect3">
  2533. <h4 id="mp_transform_qq_l">mp_transform_q&lt;Q, L&#8230;&#8203;&gt;</h4>
  2534. <div class="literalblock">
  2535. <div class="content">
  2536. <pre>template&lt;class Q, class... L&gt; using mp_transform_q =
  2537. mp_transform&lt;Q::template fn, L...&gt;;</pre>
  2538. </div>
  2539. </div>
  2540. <div class="paragraph">
  2541. <p>As <code>mp_transform</code>, but takes a quoted metafunction.</p>
  2542. </div>
  2543. <div class="listingblock">
  2544. <div class="title">Code Example 54. Using mp_transform_q to count the occurrences of <code>void</code> in a list</div>
  2545. <div class="content">
  2546. <pre class="highlight"><code>using L1 = std::tuple&lt;void, int, float, void, int&gt;;
  2547. using R1 = mp_apply&lt;mp_plus,
  2548. mp_transform_q&lt;mp_bind_front&lt;std::is_same, void&gt;, L1&gt;&gt;; // mp_int&lt;2&gt;</code></pre>
  2549. </div>
  2550. </div>
  2551. <table class="tableblock frame-all grid-all" style="width: 85%;">
  2552. <caption class="title">Illustration 3. mp_transform_q on two lists</caption>
  2553. <colgroup>
  2554. <col style="width: 50%;">
  2555. <col style="width: 12.5%;">
  2556. <col style="width: 12.5%;">
  2557. <col style="width: 12.5%;">
  2558. <col style="width: 12.5%;">
  2559. </colgroup>
  2560. <tbody>
  2561. <tr>
  2562. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L1</strong></code></p></td>
  2563. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  2564. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>2</sub></code></p></td>
  2565. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2566. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  2567. </tr>
  2568. <tr>
  2569. <td class="tableblock halign-left valign-middle" colspan="5"></td>
  2570. </tr>
  2571. <tr>
  2572. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L2</strong></code></p></td>
  2573. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>B<sub>1</sub></code></p></td>
  2574. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>B<sub>2</sub></code></p></td>
  2575. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2576. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>B<sub>n</sub></code></p></td>
  2577. </tr>
  2578. <tr>
  2579. <td class="tableblock halign-left valign-middle" colspan="5"></td>
  2580. </tr>
  2581. <tr>
  2582. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>mp_transform_q&lt;Q, L1, L2&gt;</strong></code></p></td>
  2583. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>Q::fn&lt;A<sub>1</sub>,B<sub>1</sub>&gt;</code></p></td>
  2584. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>Q::fn&lt;A<sub>2</sub>,B<sub>2</sub>&gt;</code></p></td>
  2585. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2586. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>Q::fn&lt;A<sub>n</sub>,B<sub>n</sub>&gt;</code></p></td>
  2587. </tr>
  2588. </tbody>
  2589. </table>
  2590. </div>
  2591. <div class="sect3">
  2592. <h4 id="mp_transform_ifp_f_l">mp_transform_if&lt;P, F, L&#8230;&#8203;&gt;</h4>
  2593. <div class="literalblock">
  2594. <div class="content">
  2595. <pre>template&lt;template&lt;class...&gt; class P, template&lt;class...&gt; class F, class... L&gt;
  2596. using mp_transform_if = /*...*/;</pre>
  2597. </div>
  2598. </div>
  2599. <div class="paragraph">
  2600. <p><code>mp_transform_if&lt;P, F, L1, L2, &#8230;&#8203;, Ln&gt;</code> replaces the elements of the list <code>L1</code> for which <code>mp_to_bool&lt;P&lt;T1, T2, &#8230;&#8203;, Tn&gt;&gt;</code> is <code>mp_true</code> with
  2601. <code>F&lt;T1, T2, &#8230;&#8203;, Tn&gt;</code>, and returns the result, where <code>Ti</code> are the corresponding elements of <code>Li</code>.</p>
  2602. </div>
  2603. <div class="listingblock">
  2604. <div class="title">Code Example 55. Using mp_transform_if to replace the occurrences of 'void' in a list with the corresponding elements of a second list</div>
  2605. <div class="content">
  2606. <pre class="highlight"><code>using L1 = std::tuple&lt;void, int, float, void, int&gt;;
  2607. using L2 = std::tuple&lt;char[1], char[2], char[3], char[4], char[5]&gt;;
  2608. template&lt;class T1, class T2&gt; using first_is_void = std::is_same&lt;T1, void&gt;;
  2609. template&lt;class T1, class T2&gt; using second = T2;
  2610. using R1 = mp_transform_if&lt;first_is_void, second, L1, L2&gt;;
  2611. // std::tuple&lt;char[1], int, float, char[4], int&gt;</code></pre>
  2612. </div>
  2613. </div>
  2614. <table class="tableblock frame-all grid-all" style="width: 85%;">
  2615. <caption class="title">Illustration 4. mp_transform_if</caption>
  2616. <colgroup>
  2617. <col style="width: 50%;">
  2618. <col style="width: 12.5%;">
  2619. <col style="width: 12.5%;">
  2620. <col style="width: 12.5%;">
  2621. <col style="width: 12.5%;">
  2622. </colgroup>
  2623. <tbody>
  2624. <tr>
  2625. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L1</strong></code></p></td>
  2626. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  2627. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>2</sub></code></p></td>
  2628. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2629. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  2630. </tr>
  2631. <tr>
  2632. <td class="tableblock halign-left valign-middle" colspan="5"></td>
  2633. </tr>
  2634. <tr>
  2635. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L2</strong></code></p></td>
  2636. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>B<sub>1</sub></code></p></td>
  2637. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>B<sub>2</sub></code></p></td>
  2638. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2639. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>B<sub>n</sub></code></p></td>
  2640. </tr>
  2641. <tr>
  2642. <td class="tableblock halign-left valign-middle" colspan="5"></td>
  2643. </tr>
  2644. <tr>
  2645. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>P&lt;A<sub>i</sub>, B<sub>i</sub>&gt;</strong></code></p></td>
  2646. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>mp_false</code></p></td>
  2647. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>mp_true</code></p></td>
  2648. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2649. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>mp_false</code></p></td>
  2650. </tr>
  2651. <tr>
  2652. <td class="tableblock halign-left valign-middle" colspan="5"></td>
  2653. </tr>
  2654. <tr>
  2655. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>mp_transform_if&lt;P, F, L1, L2&gt;</strong></code></p></td>
  2656. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  2657. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>F&lt;A<sub>2</sub>,B<sub>2</sub>&gt;</code></p></td>
  2658. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2659. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  2660. </tr>
  2661. </tbody>
  2662. </table>
  2663. </div>
  2664. <div class="sect3">
  2665. <h4 id="mp_transform_if_qqp_qf_l">mp_transform_if_q&lt;Qp, Qf, L&#8230;&#8203;&gt;</h4>
  2666. <div class="literalblock">
  2667. <div class="content">
  2668. <pre>template&lt;class Qp, class Qf, class... L&gt; using mp_transform_if_q =
  2669. mp_transform_if&lt;Qp::template fn, Qf::template fn, L...&gt;;</pre>
  2670. </div>
  2671. </div>
  2672. <div class="paragraph">
  2673. <p>As <code>mp_transform_if</code>, but takes quoted metafunctions.</p>
  2674. </div>
  2675. <div class="listingblock">
  2676. <div class="title">Code Example 56. Using mp_transform_if_q to replace the occurrences of 'void' in a list with the corresponding elements of a second list</div>
  2677. <div class="content">
  2678. <pre class="highlight"><code>using L1 = std::tuple&lt;void, int, float, void, int&gt;;
  2679. using L2 = std::tuple&lt;char[1], char[2], char[3], char[4], char[5]&gt;;
  2680. using R1 = mp_transform_if_q&lt;mp_bind&lt;std::is_same, _1, void&gt;, _2, L1, L2&gt;;
  2681. // std::tuple&lt;char[1], int, float, char[4], int&gt;</code></pre>
  2682. </div>
  2683. </div>
  2684. <table class="tableblock frame-all grid-all" style="width: 85%;">
  2685. <caption class="title">Illustration 5. mp_transform_if_q</caption>
  2686. <colgroup>
  2687. <col style="width: 50%;">
  2688. <col style="width: 12.5%;">
  2689. <col style="width: 12.5%;">
  2690. <col style="width: 12.5%;">
  2691. <col style="width: 12.5%;">
  2692. </colgroup>
  2693. <tbody>
  2694. <tr>
  2695. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L1</strong></code></p></td>
  2696. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  2697. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>2</sub></code></p></td>
  2698. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2699. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  2700. </tr>
  2701. <tr>
  2702. <td class="tableblock halign-left valign-middle" colspan="5"></td>
  2703. </tr>
  2704. <tr>
  2705. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L2</strong></code></p></td>
  2706. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>B<sub>1</sub></code></p></td>
  2707. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>B<sub>2</sub></code></p></td>
  2708. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2709. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>B<sub>n</sub></code></p></td>
  2710. </tr>
  2711. <tr>
  2712. <td class="tableblock halign-left valign-middle" colspan="5"></td>
  2713. </tr>
  2714. <tr>
  2715. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>Qp::fn&lt;A<sub>i</sub>, B<sub>i</sub>&gt;</strong></code></p></td>
  2716. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>mp_false</code></p></td>
  2717. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>mp_true</code></p></td>
  2718. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2719. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>mp_false</code></p></td>
  2720. </tr>
  2721. <tr>
  2722. <td class="tableblock halign-left valign-middle" colspan="5"></td>
  2723. </tr>
  2724. <tr>
  2725. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>mp_transform_if_q&lt;Qp, _2, L1, L2&gt;</strong></code></p></td>
  2726. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  2727. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>B<sub>2</sub></code></p></td>
  2728. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2729. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  2730. </tr>
  2731. </tbody>
  2732. </table>
  2733. </div>
  2734. <div class="sect3">
  2735. <h4 id="mp_filterp_l">mp_filter&lt;P, L&#8230;&#8203;&gt;</h4>
  2736. <div class="literalblock">
  2737. <div class="content">
  2738. <pre>template&lt;template&lt;class...&gt; class P, class... L&gt; using mp_filter = /*...*/;</pre>
  2739. </div>
  2740. </div>
  2741. <div class="paragraph">
  2742. <p><code>mp_filter&lt;P, L1, L2, &#8230;&#8203;, Ln&gt;</code> removes the elements of the list <code>L1</code> for which <code>mp_to_bool&lt;P&lt;T1, T2, &#8230;&#8203;, Tn&gt;&gt;</code>
  2743. is <code>mp_false</code> and returns the result, where <code>Ti</code> are the corresponding elements of <code>Li</code>.</p>
  2744. </div>
  2745. <div class="paragraph">
  2746. <p>See also <code>mp_copy_if</code> and <code>mp_remove_if</code>, less general variants of <code>mp_filter</code> that only take a single list.</p>
  2747. </div>
  2748. </div>
  2749. <div class="sect3">
  2750. <h4 id="mp_filter_qqp_l">mp_filter_q&lt;Qp, L&#8230;&#8203;&gt;</h4>
  2751. <div class="literalblock">
  2752. <div class="content">
  2753. <pre>template&lt;class Qp, class... L&gt; using mp_filter_q =
  2754. mp_filter&lt;Qp::template fn, L...&gt;;</pre>
  2755. </div>
  2756. </div>
  2757. <div class="paragraph">
  2758. <p>As <code>mp_filter</code>, but takes a quoted metafunction.</p>
  2759. </div>
  2760. <div class="listingblock">
  2761. <div class="title">Code Example 57. Using mp_filter_q to pick elements of a list based on a mask in another list</div>
  2762. <div class="content">
  2763. <pre class="highlight"><code>using L1 = std::tuple&lt;void, int, float&gt;;
  2764. using L2 = mp_list&lt;mp_true, mp_false, mp_true&gt;;
  2765. using R1 = mp_filter_q&lt;_2, L1, L2&gt;; // std::tuple&lt;void, float&gt;</code></pre>
  2766. </div>
  2767. </div>
  2768. </div>
  2769. <div class="sect3">
  2770. <h4 id="mp_filll_v">mp_fill&lt;L, V&gt;</h4>
  2771. <div class="literalblock">
  2772. <div class="content">
  2773. <pre>template&lt;class L, class V&gt; using mp_fill = /*...*/;</pre>
  2774. </div>
  2775. </div>
  2776. <div class="paragraph">
  2777. <p><code>mp_fill&lt;L&lt;T&#8230;&#8203;&gt;, V&gt;</code> returns <code>L&lt;V, V, &#8230;&#8203;, V&gt;</code>, with the result having the same size as the input.</p>
  2778. </div>
  2779. <div class="listingblock">
  2780. <div class="title">Code Example 58. Using mp_fill with std::tuple</div>
  2781. <div class="content">
  2782. <pre class="highlight"><code>using L1 = std::tuple&lt;void, int, float&gt;;
  2783. using R1 = mp_fill&lt;L1, double&gt;; // std::tuple&lt;double, double, double&gt;</code></pre>
  2784. </div>
  2785. </div>
  2786. <div class="listingblock">
  2787. <div class="title">Code Example 59. Using mp_fill with std::pair</div>
  2788. <div class="content">
  2789. <pre class="highlight"><code>using L1 = std::pair&lt;int, float&gt;;
  2790. using R1 = mp_fill&lt;L1, void&gt;; // std::pair&lt;void, void&gt;</code></pre>
  2791. </div>
  2792. </div>
  2793. <table class="tableblock frame-all grid-all" style="width: 85%;">
  2794. <caption class="title">Illustration 6. mp_fill</caption>
  2795. <colgroup>
  2796. <col style="width: 50%;">
  2797. <col style="width: 12.5%;">
  2798. <col style="width: 12.5%;">
  2799. <col style="width: 12.5%;">
  2800. <col style="width: 12.5%;">
  2801. </colgroup>
  2802. <tbody>
  2803. <tr>
  2804. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L1</strong></code></p></td>
  2805. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  2806. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>2</sub></code></p></td>
  2807. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2808. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  2809. </tr>
  2810. <tr>
  2811. <td class="tableblock halign-left valign-middle" colspan="5"></td>
  2812. </tr>
  2813. <tr>
  2814. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>mp_fill&lt;L1, V&gt;</strong></code></p></td>
  2815. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>V</code></p></td>
  2816. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>V</code></p></td>
  2817. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2818. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>V</code></p></td>
  2819. </tr>
  2820. </tbody>
  2821. </table>
  2822. </div>
  2823. <div class="sect3">
  2824. <h4 id="mp_countl_v">mp_count&lt;L, V&gt;</h4>
  2825. <div class="literalblock">
  2826. <div class="content">
  2827. <pre>template&lt;class L, class V&gt; using mp_count = /*...*/;</pre>
  2828. </div>
  2829. </div>
  2830. <div class="paragraph">
  2831. <p><code>mp_count&lt;L, V&gt;</code> returns <code>mp_size_t&lt;N&gt;</code>, where <code>N</code> is the number of elements of <code>L</code> same as <code>V</code>.</p>
  2832. </div>
  2833. </div>
  2834. <div class="sect3">
  2835. <h4 id="mp_count_ifl_p">mp_count_if&lt;L, P&gt;</h4>
  2836. <div class="literalblock">
  2837. <div class="content">
  2838. <pre>template&lt;class L, template&lt;class...&gt; class P&gt; using mp_count_if = /*...*/;</pre>
  2839. </div>
  2840. </div>
  2841. <div class="paragraph">
  2842. <p><code>mp_count_if&lt;L, P&gt;</code> returns <code>mp_size_t&lt;N&gt;</code>, where <code>N</code> is the number of elements <code>T</code> of <code>L</code> for which <code>mp_to_bool&lt;P&lt;T&gt;&gt;</code> is <code>mp_true</code>.</p>
  2843. </div>
  2844. </div>
  2845. <div class="sect3">
  2846. <h4 id="mp_count_if_ql_q">mp_count_if_q&lt;L, Q&gt;</h4>
  2847. <div class="literalblock">
  2848. <div class="content">
  2849. <pre>template&lt;class L, class Q&gt; using mp_count_if_q = mp_count_if&lt;L, Q::template fn&gt;;</pre>
  2850. </div>
  2851. </div>
  2852. <div class="paragraph">
  2853. <p>As <code>mp_count_if</code>, but takes a quoted metafunction.</p>
  2854. </div>
  2855. </div>
  2856. <div class="sect3">
  2857. <h4 id="mp_containsl_v">mp_contains&lt;L, V&gt;</h4>
  2858. <div class="literalblock">
  2859. <div class="content">
  2860. <pre>template&lt;class L, class V&gt; using mp_contains = mp_to_bool&lt;mp_count&lt;L, V&gt;&gt;;</pre>
  2861. </div>
  2862. </div>
  2863. <div class="paragraph">
  2864. <p><code>mp_contains&lt;L, V&gt;</code> is <code>mp_true</code> when <code>L</code> contains an element <code>V</code>, <code>mp_false</code> otherwise.</p>
  2865. </div>
  2866. </div>
  2867. <div class="sect3">
  2868. <h4 id="mp_starts_withl1_l2">mp_starts_with&lt;L1, L2&gt;</h4>
  2869. <div class="literalblock">
  2870. <div class="content">
  2871. <pre>template&lt;class L1, class L2&gt; using mp_starts_with = /*...*/;</pre>
  2872. </div>
  2873. </div>
  2874. <div class="paragraph">
  2875. <p><code>mp_starts_with&lt;L1, L2&gt;</code> is <code>mp_true</code> when <code>L1</code> starts with <code>L2</code>, <code>mp_false</code>
  2876. otherwise.</p>
  2877. </div>
  2878. </div>
  2879. <div class="sect3">
  2880. <h4 id="mp_repeat_cl_n">mp_repeat_c&lt;L, N&gt;</h4>
  2881. <div class="literalblock">
  2882. <div class="content">
  2883. <pre>template&lt;class L, std::size_t N&gt; using mp_repeat_c = /*...*/;</pre>
  2884. </div>
  2885. </div>
  2886. <div class="paragraph">
  2887. <p><code>mp_repeat_c&lt;L, N&gt;</code> returns a list of the same form as <code>L</code> that consists of <code>N</code> concatenated copies of <code>L</code>.</p>
  2888. </div>
  2889. <div class="listingblock">
  2890. <div class="title">Code Example 60. Using mp_repeat_c</div>
  2891. <div class="content">
  2892. <pre class="highlight"><code>using L1 = tuple&lt;int&gt;;
  2893. using R1 = mp_repeat_c&lt;L1, 3&gt;; // tuple&lt;int, int, int&gt;
  2894. using L2 = pair&lt;int, float&gt;;
  2895. using R2 = mp_repeat_c&lt;L2, 1&gt;; // pair&lt;int, float&gt;
  2896. using L3 = mp_list&lt;int, float&gt;;
  2897. using R3 = mp_repeat_c&lt;L3, 2&gt;; // mp_list&lt;int, float, int, float&gt;
  2898. using L4 = mp_list&lt;int, float, double&gt;;
  2899. using R4 = mp_repeat_c&lt;L4, 0&gt;; // mp_list&lt;&gt;</code></pre>
  2900. </div>
  2901. </div>
  2902. </div>
  2903. <div class="sect3">
  2904. <h4 id="mp_repeatl_n">mp_repeat&lt;L, N&gt;</h4>
  2905. <div class="literalblock">
  2906. <div class="content">
  2907. <pre>template&lt;class L, class N&gt; using mp_repeat = /*...*/;</pre>
  2908. </div>
  2909. </div>
  2910. <div class="paragraph">
  2911. <p>Same as <code>mp_repeat_c</code> but with a type argument <code>N</code>. The number of copies is <code>N::value</code> and must be nonnegative.</p>
  2912. </div>
  2913. </div>
  2914. <div class="sect3">
  2915. <h4 id="mp_productf_l">mp_product&lt;F, L&#8230;&#8203;&gt;</h4>
  2916. <div class="literalblock">
  2917. <div class="content">
  2918. <pre>template&lt;template&lt;class...&gt; class F, class... L&gt; using mp_product = /*...*/;</pre>
  2919. </div>
  2920. </div>
  2921. <div class="paragraph">
  2922. <p><code>mp_product&lt;F, L1&lt;T1&#8230;&#8203;&gt;, L2&lt;T2&#8230;&#8203;&gt;, &#8230;&#8203;, Ln&lt;Tn&#8230;&#8203;&gt;&gt;</code> evaluates <code>F&lt;U1, U2, &#8230;&#8203;, Un&gt;</code> for values <code>Ui</code> taken from
  2923. the Cartesian product of the lists, as if the elements <code>Ui</code> are formed by <code>n</code> nested loops, each traversing <code>Li</code>.
  2924. It returns a list of the form <code>L1&lt;V&#8230;&#8203;&gt;</code> containing the results of the application of <code>F</code>.</p>
  2925. </div>
  2926. <table class="tableblock frame-all grid-all" style="width: 85%;">
  2927. <caption class="title">Illustration 7. mp_product on two lists</caption>
  2928. <colgroup>
  2929. <col style="width: 50%;">
  2930. <col style="width: 12.5%;">
  2931. <col style="width: 12.5%;">
  2932. <col style="width: 12.5%;">
  2933. <col style="width: 12.5%;">
  2934. </colgroup>
  2935. <tbody>
  2936. <tr>
  2937. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L1</strong></code></p></td>
  2938. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  2939. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>2</sub></code></p></td>
  2940. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2941. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  2942. </tr>
  2943. <tr>
  2944. <td class="tableblock halign-left valign-middle" colspan="5"></td>
  2945. </tr>
  2946. <tr>
  2947. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L2</strong></code></p></td>
  2948. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>B<sub>1</sub></code></p></td>
  2949. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>B<sub>2</sub></code></p></td>
  2950. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2951. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>B<sub>m</sub></code></p></td>
  2952. </tr>
  2953. <tr>
  2954. <td class="tableblock halign-left valign-middle" colspan="5"></td>
  2955. </tr>
  2956. <tr>
  2957. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>mp_product&lt;F, L1, L2&gt;</strong></code></p></td>
  2958. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>F&lt;A<sub>1</sub>,B<sub>1</sub>&gt;</code></p></td>
  2959. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>F&lt;A<sub>1</sub>,B<sub>2</sub>&gt;</code></p></td>
  2960. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2961. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>F&lt;A<sub>1</sub>,B<sub>m</sub>&gt;</code></p></td>
  2962. </tr>
  2963. <tr>
  2964. <td class="tableblock halign-left valign-middle"></td>
  2965. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>F&lt;A<sub>2</sub>,B<sub>1</sub>&gt;</code></p></td>
  2966. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>F&lt;A<sub>2</sub>,B<sub>2</sub>&gt;</code></p></td>
  2967. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2968. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>F&lt;A<sub>2</sub>,B<sub>m</sub>&gt;</code></p></td>
  2969. </tr>
  2970. <tr>
  2971. <td class="tableblock halign-left valign-middle"></td>
  2972. <td class="tableblock halign-center valign-middle" colspan="4"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2973. </tr>
  2974. <tr>
  2975. <td class="tableblock halign-left valign-middle"></td>
  2976. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>F&lt;A<sub>n</sub>,B<sub>1</sub>&gt;</code></p></td>
  2977. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>F&lt;A<sub>n</sub>,B<sub>2</sub>&gt;</code></p></td>
  2978. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  2979. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>F&lt;A<sub>n</sub>,B<sub>m</sub>&gt;</code></p></td>
  2980. </tr>
  2981. </tbody>
  2982. </table>
  2983. </div>
  2984. <div class="sect3">
  2985. <h4 id="mp_product_qq_l">mp_product_q&lt;Q, L&#8230;&#8203;&gt;</h4>
  2986. <div class="literalblock">
  2987. <div class="content">
  2988. <pre>template&lt;class Q, class... L&gt; using mp_product_q = mp_product&lt;Q::template fn, L...&gt;;</pre>
  2989. </div>
  2990. </div>
  2991. <div class="paragraph">
  2992. <p>As <code>mp_product</code>, but takes a quoted metafunction.</p>
  2993. </div>
  2994. </div>
  2995. <div class="sect3">
  2996. <h4 id="mp_drop_cl_n">mp_drop_c&lt;L, N&gt;</h4>
  2997. <div class="literalblock">
  2998. <div class="content">
  2999. <pre>template&lt;class L, std::size_t N&gt; using mp_drop_c = /*...*/;</pre>
  3000. </div>
  3001. </div>
  3002. <div class="paragraph">
  3003. <p><code>mp_drop_c&lt;L, N&gt;</code> removes the first <code>N</code> elements of <code>L</code> and returns the result.</p>
  3004. </div>
  3005. <table class="tableblock frame-all grid-all" style="width: 85%;">
  3006. <caption class="title">Illustration 8. mp_drop_c</caption>
  3007. <colgroup>
  3008. <col style="width: 40%;">
  3009. <col style="width: 10%;">
  3010. <col style="width: 10%;">
  3011. <col style="width: 10%;">
  3012. <col style="width: 10%;">
  3013. <col style="width: 10%;">
  3014. <col style="width: 10%;">
  3015. </colgroup>
  3016. <tbody>
  3017. <tr>
  3018. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L1</strong></code></p></td>
  3019. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  3020. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3021. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>m</sub></code></p></td>
  3022. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>m+1</sub></code></p></td>
  3023. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3024. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  3025. </tr>
  3026. <tr>
  3027. <td class="tableblock halign-left valign-middle" colspan="7"></td>
  3028. </tr>
  3029. <tr>
  3030. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>mp_drop_c&lt;L1, M&gt;</strong></code></p></td>
  3031. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>m+1</sub></code></p></td>
  3032. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3033. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  3034. <td class="tableblock halign-center valign-middle" colspan="3"></td>
  3035. </tr>
  3036. </tbody>
  3037. </table>
  3038. </div>
  3039. <div class="sect3">
  3040. <h4 id="mp_dropl_n">mp_drop&lt;L, N&gt;</h4>
  3041. <div class="literalblock">
  3042. <div class="content">
  3043. <pre>template&lt;class L, class N&gt; using mp_drop = /*...*/;</pre>
  3044. </div>
  3045. </div>
  3046. <div class="paragraph">
  3047. <p>Same as <code>mp_drop_c</code>, but with a type argument <code>N</code>. <code>N::value</code> must be a nonnegative number.</p>
  3048. </div>
  3049. </div>
  3050. <div class="sect3">
  3051. <h4 id="mp_from_sequences">mp_from_sequence&lt;S&gt;</h4>
  3052. <div class="literalblock">
  3053. <div class="content">
  3054. <pre>template&lt;class S&gt; using mp_from_sequence = /*...*/</pre>
  3055. </div>
  3056. </div>
  3057. <div class="paragraph">
  3058. <p><code>mp_from_sequence</code> transforms an integer sequence produced by <code>make_integer_sequence</code> into an <code>mp_list</code>
  3059. of the corresponding <code>std::integral_constant</code> types. Given</p>
  3060. </div>
  3061. <div class="literalblock">
  3062. <div class="content">
  3063. <pre>template&lt;class T, T... I&gt; struct S;</pre>
  3064. </div>
  3065. </div>
  3066. <div class="paragraph">
  3067. <p><code>mp_from_sequence&lt;S&lt;T, I&#8230;&#8203;&gt;&gt;</code> is an alias for <code>mp_list&lt;std::integral_constant&lt;T, I&gt;&#8230;&#8203;&gt;</code>.</p>
  3068. </div>
  3069. </div>
  3070. <div class="sect3">
  3071. <h4 id="mp_iota_cn">mp_iota_c&lt;N&gt;</h4>
  3072. <div class="literalblock">
  3073. <div class="content">
  3074. <pre>template&lt;std::size_t N&gt; using mp_iota_c = /*...*/;</pre>
  3075. </div>
  3076. </div>
  3077. <div class="paragraph">
  3078. <p><code>mp_iota_c&lt;N&gt;</code> is an alias for <code>mp_list&lt;mp_size_t&lt;0&gt;, mp_size_t&lt;1&gt;, &#8230;&#8203;, mp_size_t&lt;N-1&gt;&gt;</code>.</p>
  3079. </div>
  3080. </div>
  3081. <div class="sect3">
  3082. <h4 id="mp_iotan">mp_iota&lt;N&gt;</h4>
  3083. <div class="literalblock">
  3084. <div class="content">
  3085. <pre>template&lt;class N&gt; using mp_iota = /*...*/;</pre>
  3086. </div>
  3087. </div>
  3088. <div class="paragraph">
  3089. <p>Same as <code>mp_iota_c</code>, but with a type argument <code>N</code>. <code>N::value</code> must be a nonnegative number. Returns
  3090. <code>mp_list&lt;std::integral_constant&lt;T, 0&gt;, std::integral_constant&lt;T, 1&gt;, &#8230;&#8203;, std::integral_constant&lt;T, N::value-1&gt;&gt;</code>
  3091. where <code>T</code> is the type of <code>N::value</code>.</p>
  3092. </div>
  3093. <table class="tableblock frame-all grid-all" style="width: 85%;">
  3094. <caption class="title">Illustration 9. mp_iota</caption>
  3095. <colgroup>
  3096. <col style="width: 50%;">
  3097. <col style="width: 12.5%;">
  3098. <col style="width: 12.5%;">
  3099. <col style="width: 12.5%;">
  3100. <col style="width: 12.5%;">
  3101. </colgroup>
  3102. <tbody>
  3103. <tr>
  3104. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>mp_iota&lt;mp_int&lt;4&gt;&gt;</strong></code></p></td>
  3105. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>mp_int&lt;0&gt;</code></p></td>
  3106. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>mp_int&lt;1&gt;</code></p></td>
  3107. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>mp_int&lt;2&gt;</code></p></td>
  3108. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>mp_int&lt;3&gt;</code></p></td>
  3109. </tr>
  3110. </tbody>
  3111. </table>
  3112. </div>
  3113. <div class="sect3">
  3114. <h4 id="mp_at_cl_i">mp_at_c&lt;L, I&gt;</h4>
  3115. <div class="literalblock">
  3116. <div class="content">
  3117. <pre>template&lt;class L, std::size_t I&gt; using mp_at_c = /*...*/;</pre>
  3118. </div>
  3119. </div>
  3120. <div class="paragraph">
  3121. <p><code>mp_at_c&lt;L, I&gt;</code> returns the <code>I</code>-th element of <code>L</code>, zero-based.</p>
  3122. </div>
  3123. </div>
  3124. <div class="sect3">
  3125. <h4 id="mp_atl_i">mp_at&lt;L, I&gt;</h4>
  3126. <div class="literalblock">
  3127. <div class="content">
  3128. <pre>template&lt;class L, class I&gt; using mp_at = /*...*/;</pre>
  3129. </div>
  3130. </div>
  3131. <div class="paragraph">
  3132. <p>Same as <code>mp_at_c</code>, but with a type argument <code>I</code>. <code>I::value</code> must be a nonnegative number.</p>
  3133. </div>
  3134. </div>
  3135. <div class="sect3">
  3136. <h4 id="mp_take_cl_n">mp_take_c&lt;L, N&gt;</h4>
  3137. <div class="literalblock">
  3138. <div class="content">
  3139. <pre>template&lt;class L, std::size_t N&gt; using mp_take_c = /*...*/;</pre>
  3140. </div>
  3141. </div>
  3142. <div class="paragraph">
  3143. <p><code>mp_take_c&lt;L, N&gt;</code> returns a list of the same form as <code>L</code> containing the first <code>N</code> elements of <code>L</code>.</p>
  3144. </div>
  3145. <table class="tableblock frame-all grid-all" style="width: 85%;">
  3146. <caption class="title">Illustration 10. mp_take_c</caption>
  3147. <colgroup>
  3148. <col style="width: 40%;">
  3149. <col style="width: 10%;">
  3150. <col style="width: 10%;">
  3151. <col style="width: 10%;">
  3152. <col style="width: 10%;">
  3153. <col style="width: 10%;">
  3154. <col style="width: 10%;">
  3155. </colgroup>
  3156. <tbody>
  3157. <tr>
  3158. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L1</strong></code></p></td>
  3159. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  3160. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3161. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>m</sub></code></p></td>
  3162. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>m+1</sub></code></p></td>
  3163. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3164. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  3165. </tr>
  3166. <tr>
  3167. <td class="tableblock halign-left valign-middle" colspan="7"></td>
  3168. </tr>
  3169. <tr>
  3170. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>mp_take_c&lt;L1, M&gt;</strong></code></p></td>
  3171. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  3172. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3173. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>m</sub></code></p></td>
  3174. <td class="tableblock halign-center valign-middle" colspan="3"></td>
  3175. </tr>
  3176. </tbody>
  3177. </table>
  3178. </div>
  3179. <div class="sect3">
  3180. <h4 id="mp_takel_n">mp_take&lt;L, N&gt;</h4>
  3181. <div class="literalblock">
  3182. <div class="content">
  3183. <pre>template&lt;class L, class N&gt; using mp_take = /*...*/;</pre>
  3184. </div>
  3185. </div>
  3186. <div class="paragraph">
  3187. <p>Same as <code>mp_take_c</code>, but with a type argument <code>N</code>. <code>N::value</code> must be a nonnegative number.</p>
  3188. </div>
  3189. </div>
  3190. <div class="sect3">
  3191. <h4 id="mp_backl">mp_back&lt;L&gt;</h4>
  3192. <div class="literalblock">
  3193. <div class="content">
  3194. <pre>template&lt;class L&gt; using mp_back = mp_at_c&lt;L, mp_size&lt;L&gt;::value - 1&gt;;</pre>
  3195. </div>
  3196. </div>
  3197. <div class="paragraph">
  3198. <p><code>mp_back&lt;L&gt;</code> returns the last element of the list <code>L</code>.</p>
  3199. </div>
  3200. </div>
  3201. <div class="sect3">
  3202. <h4 id="mp_pop_backl">mp_pop_back&lt;L&gt;</h4>
  3203. <div class="literalblock">
  3204. <div class="content">
  3205. <pre>template&lt;class L&gt; using mp_pop_back = mp_take_c&lt;L, mp_size&lt;L&gt;::value - 1&gt;;</pre>
  3206. </div>
  3207. </div>
  3208. <div class="paragraph">
  3209. <p><code>mp_pop_back&lt;L&gt;</code> removes the last element of the list <code>L</code> and returns the result.</p>
  3210. </div>
  3211. </div>
  3212. <div class="sect3">
  3213. <h4 id="mp_insert_cl_i_t">mp_insert_c&lt;L, I, T&#8230;&#8203;&gt;</h4>
  3214. <div class="literalblock">
  3215. <div class="content">
  3216. <pre>template&lt;class L, std::size_t I, class... T&gt; using mp_insert_c =
  3217. mp_append&lt;mp_take_c&lt;L, I&gt;, mp_push_front&lt;mp_drop_c&lt;L, I&gt;, T...&gt;&gt;;</pre>
  3218. </div>
  3219. </div>
  3220. <div class="paragraph">
  3221. <p>Inserts the elements <code>T&#8230;&#8203;</code> into the list <code>L</code> at position <code>I</code> (a zero-based index).</p>
  3222. </div>
  3223. <table class="tableblock frame-all grid-all" style="width: 85%;">
  3224. <caption class="title">Illustration 11. mp_insert_c with two elements</caption>
  3225. <colgroup>
  3226. <col style="width: 33.3333%;">
  3227. <col style="width: 8.3333%;">
  3228. <col style="width: 8.3333%;">
  3229. <col style="width: 8.3333%;">
  3230. <col style="width: 8.3333%;">
  3231. <col style="width: 8.3333%;">
  3232. <col style="width: 8.3333%;">
  3233. <col style="width: 8.3333%;">
  3234. <col style="width: 8.3336%;">
  3235. </colgroup>
  3236. <tbody>
  3237. <tr>
  3238. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L1</strong></code></p></td>
  3239. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  3240. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3241. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>m</sub></code></p></td>
  3242. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>m+1</sub></code></p></td>
  3243. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3244. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  3245. <td class="tableblock halign-center valign-middle" colspan="2"></td>
  3246. </tr>
  3247. <tr>
  3248. <td class="tableblock halign-left valign-middle" colspan="9"></td>
  3249. </tr>
  3250. <tr>
  3251. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>mp_insert_c&lt;L1, M, B<sub>1</sub>, B<sub>2</sub>&gt;</strong></code></p></td>
  3252. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  3253. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3254. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>m</sub></code></p></td>
  3255. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>B<sub>1</sub></code></p></td>
  3256. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>B<sub>2</sub></code></p></td>
  3257. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>m+1</sub></code></p></td>
  3258. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3259. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  3260. </tr>
  3261. </tbody>
  3262. </table>
  3263. </div>
  3264. <div class="sect3">
  3265. <h4 id="mp_insertl_i_t">mp_insert&lt;L, I, T&#8230;&#8203;&gt;</h4>
  3266. <div class="literalblock">
  3267. <div class="content">
  3268. <pre>template&lt;class L, class I, class... T&gt; using mp_insert =
  3269. mp_append&lt;mp_take&lt;L, I&gt;, mp_push_front&lt;mp_drop&lt;L, I&gt;, T...&gt;&gt;;</pre>
  3270. </div>
  3271. </div>
  3272. <div class="paragraph">
  3273. <p>Same as <code>mp_insert_c</code>, but with a type argument <code>I</code>.</p>
  3274. </div>
  3275. </div>
  3276. <div class="sect3">
  3277. <h4 id="mp_erase_cl_i_j">mp_erase_c&lt;L, I, J&gt;</h4>
  3278. <div class="literalblock">
  3279. <div class="content">
  3280. <pre>template&lt;class L, std::size_t I, std::size_t J&gt; using mp_erase_c =
  3281. mp_append&lt;mp_take_c&lt;L, I&gt;, mp_drop_c&lt;L, J&gt;&gt;;</pre>
  3282. </div>
  3283. </div>
  3284. <div class="paragraph">
  3285. <p>Removes from the list <code>L</code> the elements with indices from <code>I</code> (inclusive) to <code>J</code> (exclusive).</p>
  3286. </div>
  3287. <table class="tableblock frame-all grid-all" style="width: 85%;">
  3288. <caption class="title">Illustration 12. mp_erase_c</caption>
  3289. <colgroup>
  3290. <col style="width: 30.7692%;">
  3291. <col style="width: 7.6923%;">
  3292. <col style="width: 7.6923%;">
  3293. <col style="width: 7.6923%;">
  3294. <col style="width: 7.6923%;">
  3295. <col style="width: 7.6923%;">
  3296. <col style="width: 7.6923%;">
  3297. <col style="width: 7.6923%;">
  3298. <col style="width: 7.6923%;">
  3299. <col style="width: 7.6924%;">
  3300. </colgroup>
  3301. <tbody>
  3302. <tr>
  3303. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L1</strong></code></p></td>
  3304. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>0</sub></code></p></td>
  3305. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3306. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>i-1</sub></code></p></td>
  3307. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>i</sub></code></p></td>
  3308. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3309. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>j-1</sub></code></p></td>
  3310. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>j</sub></code></p></td>
  3311. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3312. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n-1</sub></code></p></td>
  3313. </tr>
  3314. <tr>
  3315. <td class="tableblock halign-left valign-middle" colspan="10"></td>
  3316. </tr>
  3317. <tr>
  3318. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>mp_erase_c&lt;L1, I, J&gt;</strong></code></p></td>
  3319. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>0</sub></code></p></td>
  3320. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3321. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>i-1</sub></code></p></td>
  3322. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>j</sub></code></p></td>
  3323. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3324. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n-1</sub></code></p></td>
  3325. <td class="tableblock halign-center valign-middle" colspan="3"></td>
  3326. </tr>
  3327. </tbody>
  3328. </table>
  3329. </div>
  3330. <div class="sect3">
  3331. <h4 id="mp_erasel_i_j">mp_erase&lt;L, I, J&gt;</h4>
  3332. <div class="literalblock">
  3333. <div class="content">
  3334. <pre>template&lt;class L, class I, class J&gt; using mp_erase =
  3335. mp_append&lt;mp_take&lt;L, I&gt;, mp_drop&lt;L, J&gt;&gt;;</pre>
  3336. </div>
  3337. </div>
  3338. <div class="paragraph">
  3339. <p>Same as <code>mp_erase_c</code>, but with a type arguments <code>I</code> and <code>J</code>.</p>
  3340. </div>
  3341. </div>
  3342. <div class="sect3">
  3343. <h4 id="mp_replacel_v_w">mp_replace&lt;L, V, W&gt;</h4>
  3344. <div class="literalblock">
  3345. <div class="content">
  3346. <pre>template&lt;class L, class V, class W&gt; using mp_replace = /*...*/;</pre>
  3347. </div>
  3348. </div>
  3349. <div class="paragraph">
  3350. <p>Replaces all <code>V</code> elements of <code>L</code> with <code>W</code> and returns the result.</p>
  3351. </div>
  3352. <table class="tableblock frame-all grid-all" style="width: 85%;">
  3353. <caption class="title">Illustration 13. mp_replace</caption>
  3354. <colgroup>
  3355. <col style="width: 50%;">
  3356. <col style="width: 12.5%;">
  3357. <col style="width: 12.5%;">
  3358. <col style="width: 12.5%;">
  3359. <col style="width: 12.5%;">
  3360. </colgroup>
  3361. <tbody>
  3362. <tr>
  3363. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L1</strong></code></p></td>
  3364. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  3365. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>V</code></p></td>
  3366. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3367. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  3368. </tr>
  3369. <tr>
  3370. <td class="tableblock halign-left valign-middle" colspan="5"></td>
  3371. </tr>
  3372. <tr>
  3373. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>mp_replace&lt;L1, V, W&gt;</strong></code></p></td>
  3374. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  3375. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>W</code></p></td>
  3376. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3377. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  3378. </tr>
  3379. </tbody>
  3380. </table>
  3381. </div>
  3382. <div class="sect3">
  3383. <h4 id="mp_replace_ifl_p_w">mp_replace_if&lt;L, P, W&gt;</h4>
  3384. <div class="literalblock">
  3385. <div class="content">
  3386. <pre>template&lt;class L, template&lt;class...&gt; class P, class W&gt; using mp_replace_if = /*...*/;</pre>
  3387. </div>
  3388. </div>
  3389. <div class="paragraph">
  3390. <p>Replaces all <code>T</code> elements of <code>L</code> for which <code>mp_to_bool&lt;P&lt;T&gt;&gt;</code> is <code>mp_true</code> with <code>W</code> and returns the result.</p>
  3391. </div>
  3392. <table class="tableblock frame-all grid-all" style="width: 85%;">
  3393. <caption class="title">Illustration 14. mp_replace_if</caption>
  3394. <colgroup>
  3395. <col style="width: 50%;">
  3396. <col style="width: 12.5%;">
  3397. <col style="width: 12.5%;">
  3398. <col style="width: 12.5%;">
  3399. <col style="width: 12.5%;">
  3400. </colgroup>
  3401. <tbody>
  3402. <tr>
  3403. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L1</strong></code></p></td>
  3404. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  3405. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>2</sub></code></p></td>
  3406. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3407. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  3408. </tr>
  3409. <tr>
  3410. <td class="tableblock halign-left valign-middle" colspan="5"></td>
  3411. </tr>
  3412. <tr>
  3413. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>P&lt;A<sub>i</sub>&gt;</strong></code></p></td>
  3414. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>mp_false</code></p></td>
  3415. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>mp_true</code></p></td>
  3416. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3417. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>mp_false</code></p></td>
  3418. </tr>
  3419. <tr>
  3420. <td class="tableblock halign-left valign-middle" colspan="5"></td>
  3421. </tr>
  3422. <tr>
  3423. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>mp_replace_if&lt;L1, P, W&gt;</strong></code></p></td>
  3424. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  3425. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>W</code></p></td>
  3426. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3427. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  3428. </tr>
  3429. </tbody>
  3430. </table>
  3431. </div>
  3432. <div class="sect3">
  3433. <h4 id="mp_replace_if_ql_q_w">mp_replace_if_q&lt;L, Q, W&gt;</h4>
  3434. <div class="literalblock">
  3435. <div class="content">
  3436. <pre>template&lt;class L, class Q, class W&gt; using mp_replace_if_q =
  3437. mp_replace_if&lt;L, Q::template fn, W&gt;;</pre>
  3438. </div>
  3439. </div>
  3440. <div class="paragraph">
  3441. <p>As <code>mp_replace_if</code>, but takes a quoted metafunction.</p>
  3442. </div>
  3443. </div>
  3444. <div class="sect3">
  3445. <h4 id="mp_replace_at_cl_i_w">mp_replace_at_c&lt;L, I, W&gt;</h4>
  3446. <div class="literalblock">
  3447. <div class="content">
  3448. <pre>template&lt;class L, std::size_t I, class W&gt; using mp_replace_at_c = /*...*/;</pre>
  3449. </div>
  3450. </div>
  3451. <div class="paragraph">
  3452. <p>Replaces the element of <code>L</code> at zero-based index <code>I</code> with <code>W</code> and returns the result.</p>
  3453. </div>
  3454. </div>
  3455. <div class="sect3">
  3456. <h4 id="mp_replace_atl_i_w">mp_replace_at&lt;L, I, W&gt;</h4>
  3457. <div class="literalblock">
  3458. <div class="content">
  3459. <pre>template&lt;class L, class I, class W&gt; using mp_replace_at = /*...*/;</pre>
  3460. </div>
  3461. </div>
  3462. <div class="paragraph">
  3463. <p>Same as <code>mp_replace_at_c</code>, but with a type argument <code>I</code>. <code>I::value</code> must be a nonnegative number.</p>
  3464. </div>
  3465. </div>
  3466. <div class="sect3">
  3467. <h4 id="mp_copy_ifl_p">mp_copy_if&lt;L, P&gt;</h4>
  3468. <div class="literalblock">
  3469. <div class="content">
  3470. <pre>template&lt;class L, template&lt;class...&gt; class P&gt; using mp_copy_if = /*...*/;</pre>
  3471. </div>
  3472. </div>
  3473. <div class="paragraph">
  3474. <p>Copies the elements <code>T</code> of <code>L</code> for which <code>mp_to_bool&lt;P&lt;T&gt;&gt;</code> is <code>mp_true</code> to a new list of the same form and returns it.</p>
  3475. </div>
  3476. </div>
  3477. <div class="sect3">
  3478. <h4 id="mp_copy_if_ql_q">mp_copy_if_q&lt;L, Q&gt;</h4>
  3479. <div class="literalblock">
  3480. <div class="content">
  3481. <pre>template&lt;class L, class Q&gt; using mp_copy_if_q = mp_copy_if&lt;L, Q::template fn&gt;;</pre>
  3482. </div>
  3483. </div>
  3484. <div class="paragraph">
  3485. <p>As <code>mp_copy_if</code>, but takes a quoted metafunction.</p>
  3486. </div>
  3487. </div>
  3488. <div class="sect3">
  3489. <h4 id="mp_removel_v">mp_remove&lt;L, V&gt;</h4>
  3490. <div class="literalblock">
  3491. <div class="content">
  3492. <pre>template&lt;class L, class V&gt; using mp_remove = /*...*/;</pre>
  3493. </div>
  3494. </div>
  3495. <div class="paragraph">
  3496. <p>Removes all <code>V</code> elements of <code>L</code> and returns the result.</p>
  3497. </div>
  3498. </div>
  3499. <div class="sect3">
  3500. <h4 id="mp_remove_ifl_p">mp_remove_if&lt;L, P&gt;</h4>
  3501. <div class="literalblock">
  3502. <div class="content">
  3503. <pre>template&lt;class L, template&lt;class...&gt; class P&gt; using mp_remove_if = /*...*/;</pre>
  3504. </div>
  3505. </div>
  3506. <div class="paragraph">
  3507. <p>Removes all elements <code>T</code> of <code>L</code> for which <code>mp_to_bool&lt;P&lt;T&gt;&gt;</code> is <code>mp_true</code> and returns the result.</p>
  3508. </div>
  3509. </div>
  3510. <div class="sect3">
  3511. <h4 id="mp_remove_if_ql_q">mp_remove_if_q&lt;L, Q&gt;</h4>
  3512. <div class="literalblock">
  3513. <div class="content">
  3514. <pre>template&lt;class L, class Q&gt; using mp_remove_if_q = mp_remove_if&lt;L, Q::template fn&gt;;</pre>
  3515. </div>
  3516. </div>
  3517. <div class="paragraph">
  3518. <p>As <code>mp_remove_if</code>, but takes a quoted metafunction.</p>
  3519. </div>
  3520. </div>
  3521. <div class="sect3">
  3522. <h4 id="mp_partitionl_p">mp_partition&lt;L, P&gt;</h4>
  3523. <div class="literalblock">
  3524. <div class="content">
  3525. <pre>template&lt;class L, template&lt;class...&gt; class P&gt; using mp_partition = /*...*/;</pre>
  3526. </div>
  3527. </div>
  3528. <div class="paragraph">
  3529. <p><code>mp_partition&lt;L&lt;T&#8230;&#8203;&gt;, P&gt;</code> partitions <code>L</code> into two lists <code>L&lt;U1&#8230;&#8203;&gt;</code> and <code>L&lt;U2&#8230;&#8203;&gt;</code> such that <code>mp_to_bool&lt;P&lt;T&gt;&gt;</code> is <code>mp_true</code>
  3530. for the elements of <code>L&lt;U1&#8230;&#8203;&gt;</code> and <code>mp_false</code> for the elements of <code>L&lt;U2&#8230;&#8203;&gt;</code>. Returns <code>L&lt;L&lt;U1&#8230;&#8203;&gt;, L&lt;U2&#8230;&#8203;&gt;&gt;</code>.</p>
  3531. </div>
  3532. </div>
  3533. <div class="sect3">
  3534. <h4 id="mp_partition_ql_q">mp_partition_q&lt;L, Q&gt;</h4>
  3535. <div class="literalblock">
  3536. <div class="content">
  3537. <pre>template&lt;class L, class Q&gt; using mp_partition_q = mp_partition&lt;L, Q::template fn&gt;;</pre>
  3538. </div>
  3539. </div>
  3540. <div class="paragraph">
  3541. <p>As <code>mp_partition</code>, but takes a quoted metafunction.</p>
  3542. </div>
  3543. </div>
  3544. <div class="sect3">
  3545. <h4 id="mp_sortl_p">mp_sort&lt;L, P&gt;</h4>
  3546. <div class="literalblock">
  3547. <div class="content">
  3548. <pre>template&lt;class L, template&lt;class...&gt; class P&gt; using mp_sort = /*...*/;</pre>
  3549. </div>
  3550. </div>
  3551. <div class="paragraph">
  3552. <p><code>mp_sort&lt;L, P&gt;</code> sorts the list <code>L</code> according to the strict weak ordering <code>mp_to_bool&lt;P&lt;T, U&gt;&gt;</code>.</p>
  3553. </div>
  3554. <div class="listingblock">
  3555. <div class="title">Code Example 61. Using mp_sort to sort a list of std::ratio values</div>
  3556. <div class="content">
  3557. <pre>#include &lt;ratio&gt;
  3558. using L1 = mp_list&lt;std::ratio&lt;1,2&gt;, std::ratio&lt;1,4&gt;&gt;;
  3559. using R1 = mp_sort&lt;L1, std::ratio_less&gt;; // mp_list&lt;ratio&lt;1,4&gt;, ratio&lt;1,2&gt;&gt;</pre>
  3560. </div>
  3561. </div>
  3562. </div>
  3563. <div class="sect3">
  3564. <h4 id="mp_sort_ql_q">mp_sort_q&lt;L, Q&gt;</h4>
  3565. <div class="literalblock">
  3566. <div class="content">
  3567. <pre>template&lt;class L, class Q&gt; using mp_sort_q = mp_sort&lt;L, Q::template fn&gt;;</pre>
  3568. </div>
  3569. </div>
  3570. <div class="paragraph">
  3571. <p>As <code>mp_sort</code>, but takes a quoted metafunction.</p>
  3572. </div>
  3573. </div>
  3574. <div class="sect3">
  3575. <h4 id="mp_nth_element_cl_i_p">mp_nth_element_c&lt;L, I, P&gt;</h4>
  3576. <div class="literalblock">
  3577. <div class="content">
  3578. <pre>template&lt;class L, std::size_t I, template&lt;class...&gt; class P&gt; using mp_nth_element_c =
  3579. /*...*/;</pre>
  3580. </div>
  3581. </div>
  3582. <div class="paragraph">
  3583. <p>Returns the element at position <code>I</code> in <code>mp_sort&lt;L, P&gt;</code>.</p>
  3584. </div>
  3585. </div>
  3586. <div class="sect3">
  3587. <h4 id="mp_nth_elementl_i_p">mp_nth_element&lt;L, I, P&gt;</h4>
  3588. <div class="literalblock">
  3589. <div class="content">
  3590. <pre>template&lt;class L, class I, template&lt;class...&gt; class P&gt; using mp_nth_element = /*...*/;</pre>
  3591. </div>
  3592. </div>
  3593. <div class="paragraph">
  3594. <p>Like <code>mp_nth_element_c</code>, but with a type argument <code>I</code>. <code>I::value</code> must be a nonnegative number.</p>
  3595. </div>
  3596. </div>
  3597. <div class="sect3">
  3598. <h4 id="mp_nth_element_ql_i_q">mp_nth_element_q&lt;L, I, Q&gt;</h4>
  3599. <div class="literalblock">
  3600. <div class="content">
  3601. <pre>template&lt;class L, class I, class Q&gt; using mp_nth_element_q =
  3602. mp_nth_element&lt;L, I, Q::template fn&gt;;</pre>
  3603. </div>
  3604. </div>
  3605. <div class="paragraph">
  3606. <p>Like <code>mp_nth_element</code>, but takes a quoted metafunction.</p>
  3607. </div>
  3608. </div>
  3609. <div class="sect3">
  3610. <h4 id="mp_min_elementl_p">mp_min_element&lt;L, P&gt;</h4>
  3611. <div class="literalblock">
  3612. <div class="content">
  3613. <pre>template&lt;class L, template&lt;class...&gt; class P&gt; using mp_min_element = /*...*/;</pre>
  3614. </div>
  3615. </div>
  3616. <div class="paragraph">
  3617. <p><code>mp_min_element&lt;L, P&gt;</code> returns the minimal element of the list <code>L</code> according to the ordering <code>mp_to_bool&lt;P&lt;T, U&gt;&gt;</code>.</p>
  3618. </div>
  3619. <div class="paragraph">
  3620. <p>It&#8217;s equivalent to <code>mp_fold&lt;mp_rest&lt;L&gt;, mp_first&lt;L&gt;, F&gt;</code>, where <code>F&lt;T, U&gt;</code> returns <code>mp_if&lt;P&lt;T, U&gt;, T, U&gt;</code>.</p>
  3621. </div>
  3622. </div>
  3623. <div class="sect3">
  3624. <h4 id="mp_min_element_ql_q">mp_min_element_q&lt;L, Q&gt;</h4>
  3625. <div class="literalblock">
  3626. <div class="content">
  3627. <pre>template&lt;class L, class Q&gt; using mp_min_element_q = mp_min_element&lt;L, Q::template fn&gt;;</pre>
  3628. </div>
  3629. </div>
  3630. <div class="paragraph">
  3631. <p>As <code>mp_min_element</code>, but takes a quoted metafunction.</p>
  3632. </div>
  3633. </div>
  3634. <div class="sect3">
  3635. <h4 id="mp_max_elementl_p">mp_max_element&lt;L, P&gt;</h4>
  3636. <div class="literalblock">
  3637. <div class="content">
  3638. <pre>template&lt;class L, template&lt;class...&gt; class P&gt; using mp_max_element = /*...*/;</pre>
  3639. </div>
  3640. </div>
  3641. <div class="paragraph">
  3642. <p><code>mp_max_element&lt;L, P&gt;</code> returns the maximal element of the list <code>L</code> according to the ordering <code>mp_to_bool&lt;P&lt;T, U&gt;&gt;</code>.</p>
  3643. </div>
  3644. <div class="paragraph">
  3645. <p>It&#8217;s equivalent to <code>mp_fold&lt;mp_rest&lt;L&gt;, mp_first&lt;L&gt;, F&gt;</code>, where <code>F&lt;T, U&gt;</code> returns <code>mp_if&lt;P&lt;U, T&gt;, T, U&gt;</code>.</p>
  3646. </div>
  3647. </div>
  3648. <div class="sect3">
  3649. <h4 id="mp_max_element_ql_q">mp_max_element_q&lt;L, Q&gt;</h4>
  3650. <div class="literalblock">
  3651. <div class="content">
  3652. <pre>template&lt;class L, class Q&gt; using mp_max_element_q = mp_max_element&lt;L, Q::template fn&gt;;</pre>
  3653. </div>
  3654. </div>
  3655. <div class="paragraph">
  3656. <p>As <code>mp_max_element</code>, but takes a quoted metafunction.</p>
  3657. </div>
  3658. </div>
  3659. <div class="sect3">
  3660. <h4 id="mp_findl_v">mp_find&lt;L, V&gt;</h4>
  3661. <div class="literalblock">
  3662. <div class="content">
  3663. <pre>template&lt;class L, class V&gt; using mp_find = /*...*/;</pre>
  3664. </div>
  3665. </div>
  3666. <div class="paragraph">
  3667. <p><code>mp_find&lt;L, V&gt;</code> returns the index at which the type <code>V</code> is located in the list <code>L</code>. It&#8217;s an alias for <code>mp_size_t&lt;I&gt;</code>,
  3668. where <code>I</code> is the zero-based index of the first occurrence of <code>V</code> in <code>L</code>. If <code>L</code> does not contain <code>V</code>, <code>mp_find&lt;L, V&gt;</code>
  3669. is <code>mp_size&lt;L&gt;</code>.</p>
  3670. </div>
  3671. </div>
  3672. <div class="sect3">
  3673. <h4 id="mp_find_ifl_p">mp_find_if&lt;L, P&gt;</h4>
  3674. <div class="literalblock">
  3675. <div class="content">
  3676. <pre>template&lt;class L, template&lt;class...&gt; class P&gt; using mp_find_if = /*...*/;</pre>
  3677. </div>
  3678. </div>
  3679. <div class="paragraph">
  3680. <p><code>mp_find_f&lt;L, P&gt;</code> is an alias for <code>mp_size_t&lt;I&gt;</code>, where <code>I</code> is the zero-based index of the first element <code>T</code> in <code>L</code> for which
  3681. <code>mp_to_bool&lt;P&lt;T&gt;&gt;</code> is <code>mp_true</code>. If there is no such element, <code>mp_find_if&lt;L, P&gt;</code> is <code>mp_size&lt;L&gt;</code>.</p>
  3682. </div>
  3683. </div>
  3684. <div class="sect3">
  3685. <h4 id="mp_find_if_ql_q">mp_find_if_q&lt;L, Q&gt;</h4>
  3686. <div class="literalblock">
  3687. <div class="content">
  3688. <pre>template&lt;class L, class Q&gt; using mp_find_if_q = mp_find_if&lt;L, Q::template fn&gt;;</pre>
  3689. </div>
  3690. </div>
  3691. <div class="paragraph">
  3692. <p>As <code>mp_find_if</code>, but takes a quoted metafunction.</p>
  3693. </div>
  3694. </div>
  3695. <div class="sect3">
  3696. <h4 id="mp_reversel">mp_reverse&lt;L&gt;</h4>
  3697. <div class="literalblock">
  3698. <div class="content">
  3699. <pre>template&lt;class L&gt; using mp_reverse = /*...*/;</pre>
  3700. </div>
  3701. </div>
  3702. <div class="paragraph">
  3703. <p><code>mp_reverse&lt;L&lt;T1, T2, &#8230;&#8203;, Tn&gt;&gt;</code> is <code>L&lt;Tn, &#8230;&#8203;, T2, T1&gt;</code>.</p>
  3704. </div>
  3705. <table class="tableblock frame-all grid-all" style="width: 85%;">
  3706. <caption class="title">Illustration 15. mp_reverse</caption>
  3707. <colgroup>
  3708. <col style="width: 50%;">
  3709. <col style="width: 12.5%;">
  3710. <col style="width: 12.5%;">
  3711. <col style="width: 12.5%;">
  3712. <col style="width: 12.5%;">
  3713. </colgroup>
  3714. <tbody>
  3715. <tr>
  3716. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>L1</strong></code></p></td>
  3717. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  3718. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>2</sub></code></p></td>
  3719. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3720. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  3721. </tr>
  3722. <tr>
  3723. <td class="tableblock halign-left valign-middle" colspan="5"></td>
  3724. </tr>
  3725. <tr>
  3726. <td class="tableblock halign-left valign-middle"><p class="tableblock"><code><strong>mp_reverse&lt;L1&gt;</strong></code></p></td>
  3727. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n</sub></code></p></td>
  3728. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>n-1</sub></code></p></td>
  3729. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>&#8230;&#8203;</code></p></td>
  3730. <td class="tableblock halign-center valign-middle"><p class="tableblock"><code>A<sub>1</sub></code></p></td>
  3731. </tr>
  3732. </tbody>
  3733. </table>
  3734. </div>
  3735. <div class="sect3">
  3736. <h4 id="mp_foldl_v_f">mp_fold&lt;L, V, F&gt;</h4>
  3737. <div class="literalblock">
  3738. <div class="content">
  3739. <pre>template&lt;class L, class V, template&lt;class...&gt; class F&gt; using mp_fold = /*...*/;</pre>
  3740. </div>
  3741. </div>
  3742. <div class="paragraph">
  3743. <p><code>mp_fold&lt;L&lt;T1, T2, &#8230;&#8203;, Tn&gt;, V, F&gt;</code> is <code>F&lt; F&lt; F&lt; F&lt;V, T1&gt;, T2&gt;, &#8230;&#8203;&gt;, Tn&gt;</code>, or <code>V</code>, if <code>L</code> is empty.</p>
  3744. </div>
  3745. <div class="listingblock">
  3746. <div class="title">Code Example 62. Using mp_fold to add the contents of a list of std::ratio values</div>
  3747. <div class="content">
  3748. <pre>#include &lt;ratio&gt;
  3749. using L1 = mp_list&lt;std::ratio&lt;1,8&gt;, std::ratio&lt;1,4&gt;, std::ratio&lt;1,2&gt;&gt;;
  3750. using R1 = mp_fold&lt;L1, std::ratio&lt;0,1&gt;, std::ratio_add&gt;; // std::ratio&lt;7,8&gt;</pre>
  3751. </div>
  3752. </div>
  3753. </div>
  3754. <div class="sect3">
  3755. <h4 id="mp_fold_ql_v_q">mp_fold_q&lt;L, V, Q&gt;</h4>
  3756. <div class="literalblock">
  3757. <div class="content">
  3758. <pre>template&lt;class L, class V, class Q&gt; using mp_fold_q =
  3759. mp_fold&lt;L, V, Q::template fn&gt;;</pre>
  3760. </div>
  3761. </div>
  3762. <div class="paragraph">
  3763. <p>As <code>mp_fold</code>, but takes a quoted metafunction.</p>
  3764. </div>
  3765. </div>
  3766. <div class="sect3">
  3767. <h4 id="mp_reverse_foldl_v_f">mp_reverse_fold&lt;L, V, F&gt;</h4>
  3768. <div class="literalblock">
  3769. <div class="content">
  3770. <pre>template&lt;class L, class V, template&lt;class...&gt; class F&gt; using mp_reverse_fold =
  3771. /*...*/;</pre>
  3772. </div>
  3773. </div>
  3774. <div class="paragraph">
  3775. <p><code>mp_reverse_fold&lt;L&lt;T1, T2, &#8230;&#8203;, Tn&gt;, V, F&gt;</code> is <code>F&lt;T1, F&lt;T2, F&lt;&#8230;&#8203;, F&lt;Tn, V&gt;&gt;&gt;&gt;</code>, or <code>V</code>, if <code>L</code> is empty.</p>
  3776. </div>
  3777. </div>
  3778. <div class="sect3">
  3779. <h4 id="mp_reverse_fold_ql_v_q">mp_reverse_fold_q&lt;L, V, Q&gt;</h4>
  3780. <div class="literalblock">
  3781. <div class="content">
  3782. <pre>template&lt;class L, class V, class Q&gt; using mp_reverse_fold_q =
  3783. mp_reverse_fold&lt;L, V, Q::template fn&gt;;</pre>
  3784. </div>
  3785. </div>
  3786. <div class="paragraph">
  3787. <p>As <code>mp_reverse_fold</code>, but takes a quoted metafunction.</p>
  3788. </div>
  3789. </div>
  3790. <div class="sect3">
  3791. <h4 id="mp_uniquel">mp_unique&lt;L&gt;</h4>
  3792. <div class="literalblock">
  3793. <div class="content">
  3794. <pre>template&lt;class L&gt; using mp_unique = /*...*/;</pre>
  3795. </div>
  3796. </div>
  3797. <div class="paragraph">
  3798. <p><code>mp_unique&lt;L&gt;</code> returns a list of the same form as <code>L</code> with the duplicate elements removed.</p>
  3799. </div>
  3800. </div>
  3801. <div class="sect3">
  3802. <h4 id="mp_all_ofl_p">mp_all_of&lt;L, P&gt;</h4>
  3803. <div class="literalblock">
  3804. <div class="content">
  3805. <pre>template&lt;class L, template&lt;class...&gt; class P&gt; using mp_all_of =
  3806. mp_bool&lt; mp_count_if&lt;L, P&gt;::value == mp_size&lt;L&gt;::value &gt;;</pre>
  3807. </div>
  3808. </div>
  3809. <div class="paragraph">
  3810. <p><code>mp_all_of&lt;L, P&gt;</code> is <code>mp_true</code> when <code>P</code> holds for all elements of <code>L</code>, <code>mp_false</code> otherwise. When <code>L</code> is empty, the result is <code>mp_true</code>.</p>
  3811. </div>
  3812. </div>
  3813. <div class="sect3">
  3814. <h4 id="mp_all_of_ql_q">mp_all_of_q&lt;L, Q&gt;</h4>
  3815. <div class="literalblock">
  3816. <div class="content">
  3817. <pre>template&lt;class L, class Q&gt; using mp_all_of_q = mp_all_of&lt;L, Q::template fn&gt;;</pre>
  3818. </div>
  3819. </div>
  3820. <div class="paragraph">
  3821. <p>As <code>mp_all_of</code>, but takes a quoted metafunction.</p>
  3822. </div>
  3823. </div>
  3824. <div class="sect3">
  3825. <h4 id="mp_none_ofl_p">mp_none_of&lt;L, P&gt;</h4>
  3826. <div class="literalblock">
  3827. <div class="content">
  3828. <pre>template&lt;class L, template&lt;class...&gt; class P&gt; using mp_none_of =
  3829. mp_bool&lt; mp_count_if&lt;L, P&gt;::value == 0 &gt;;</pre>
  3830. </div>
  3831. </div>
  3832. <div class="paragraph">
  3833. <p><code>mp_none_of&lt;L, P&gt;</code> is <code>mp_true</code> when <code>P</code> holds for no element of <code>L</code>, <code>mp_false</code> otherwise. When <code>L</code> is empty, the result is <code>mp_true</code>.</p>
  3834. </div>
  3835. </div>
  3836. <div class="sect3">
  3837. <h4 id="mp_none_of_ql_q">mp_none_of_q&lt;L, Q&gt;</h4>
  3838. <div class="literalblock">
  3839. <div class="content">
  3840. <pre>template&lt;class L, class Q&gt; using mp_none_of_q = mp_none_of&lt;L, Q::template fn&gt;;</pre>
  3841. </div>
  3842. </div>
  3843. <div class="paragraph">
  3844. <p>As <code>mp_none_of</code>, but takes a quoted metafunction.</p>
  3845. </div>
  3846. </div>
  3847. <div class="sect3">
  3848. <h4 id="mp_any_ofl_p">mp_any_of&lt;L, P&gt;</h4>
  3849. <div class="literalblock">
  3850. <div class="content">
  3851. <pre>template&lt;class L, template&lt;class...&gt; class P&gt; using mp_any_of =
  3852. mp_bool&lt; mp_count_if&lt;L, P&gt;::value != 0 &gt;;</pre>
  3853. </div>
  3854. </div>
  3855. <div class="paragraph">
  3856. <p><code>mp_any_of&lt;L, P&gt;</code> is <code>mp_true</code> when <code>P</code> holds for at least one element of <code>L</code>, <code>mp_false</code> otherwise. When <code>L</code> is empty, the result is <code>mp_false</code>.</p>
  3857. </div>
  3858. </div>
  3859. <div class="sect3">
  3860. <h4 id="mp_any_of_ql_q">mp_any_of_q&lt;L, Q&gt;</h4>
  3861. <div class="literalblock">
  3862. <div class="content">
  3863. <pre>template&lt;class L, class Q&gt; using mp_any_of_q = mp_any_of&lt;L, Q::template fn&gt;;</pre>
  3864. </div>
  3865. </div>
  3866. <div class="paragraph">
  3867. <p>As <code>mp_any_of</code>, but takes a quoted metafunction.</p>
  3868. </div>
  3869. </div>
  3870. <div class="sect3">
  3871. <h4 id="mp_for_eachlf">mp_for_each&lt;L&gt;(f)</h4>
  3872. <div class="literalblock">
  3873. <div class="content">
  3874. <pre>template&lt;class L, class F&gt; constexpr F mp_for_each(F&amp;&amp; f);</pre>
  3875. </div>
  3876. </div>
  3877. <div class="paragraph">
  3878. <p><code>mp_for_each&lt;L&gt;(f)</code> calls <code>f</code> with <code>T()</code> for each element <code>T</code> of the list <code>L</code>, in order.</p>
  3879. </div>
  3880. <div class="paragraph">
  3881. <p>Returns <code>std::forward&lt;F&gt;(f)</code>.</p>
  3882. </div>
  3883. <div class="listingblock">
  3884. <div class="title">Code Example 63. Using mp_for_each and a C++14 lambda to print a tuple</div>
  3885. <div class="content">
  3886. <pre class="highlight"><code>template&lt;class... T&gt; void print( std::tuple&lt;T...&gt; const &amp; tp )
  3887. {
  3888. std::size_t const N = sizeof...(T);
  3889. mp_for_each&lt;mp_iota_c&lt;N&gt;&gt;( [&amp;]( auto I ){
  3890. // I is mp_size_t&lt;0&gt;, mp_size_t&lt;1&gt;, ..., mp_size_t&lt;N-1&gt;
  3891. std::cout &lt;&lt; std::get&lt;I&gt;(tp) &lt;&lt; std::endl;
  3892. });
  3893. }</code></pre>
  3894. </div>
  3895. </div>
  3896. </div>
  3897. <div class="sect3">
  3898. <h4 id="mp_with_indexni_f">mp_with_index&lt;N&gt;(i, f)</h4>
  3899. <div class="literalblock">
  3900. <div class="content">
  3901. <pre>template&lt;std::size_t N, class F&gt;
  3902. constexpr auto mp_with_index( std::size_t i, F &amp;&amp; f )
  3903. -&gt; decltype(std::declval&lt;F&gt;()(std::declval&lt;mp_size_t&lt;0&gt;&gt;()));</pre>
  3904. </div>
  3905. </div>
  3906. <div class="paragraph">
  3907. <p><code>mp_with_index&lt;N&gt;(i, f)</code> calls <code>f</code> with <code>mp_size_t&lt;i&gt;()</code> and returns the result. <code>i</code> must be less than <code>N</code>.
  3908. Only <code>constexpr</code> on C++14 and higher.</p>
  3909. </div>
  3910. <div class="literalblock">
  3911. <div class="content">
  3912. <pre>template&lt;class N, class F&gt;
  3913. constexpr auto mp_with_index( std::size_t i, F &amp;&amp; f )
  3914. -&gt; decltype(std::declval&lt;F&gt;()(std::declval&lt;mp_size_t&lt;0&gt;&gt;()));</pre>
  3915. </div>
  3916. </div>
  3917. <div class="paragraph">
  3918. <p>Returns <code>mp_with_index&lt;N::value&gt;(i, f)</code>.</p>
  3919. </div>
  3920. <div class="listingblock">
  3921. <div class="title">Code Example 64. Using mp_with_index and a C++14 lambda to print the active element of a variant</div>
  3922. <div class="content">
  3923. <pre class="highlight"><code>template&lt;class... T&gt; void print( std::variant&lt;T...&gt; const&amp; v )
  3924. {
  3925. mp_with_index&lt;sizeof...(T)&gt;( v.index(), [&amp;]( auto I ) {
  3926. // I is mp_size_t&lt;v.index()&gt;{} here
  3927. std::cout &lt;&lt; std::get&lt;I&gt;( v ) &lt;&lt; std::endl;
  3928. });
  3929. }</code></pre>
  3930. </div>
  3931. </div>
  3932. </div>
  3933. </div>
  3934. <div class="sect2">
  3935. <h3 id="set">Set Operations, &lt;boost/mp11/set.hpp&gt;</h3>
  3936. <div class="paragraph">
  3937. <p>A set is a list whose elements are unique.</p>
  3938. </div>
  3939. <div class="sect3">
  3940. <h4 id="mp_is_sets">mp_is_set&lt;S&gt;</h4>
  3941. <div class="literalblock">
  3942. <div class="content">
  3943. <pre>template&lt;class S&gt; using mp_is_set = /*...*/;</pre>
  3944. </div>
  3945. </div>
  3946. <div class="paragraph">
  3947. <p><code>mp_is_set&lt;S&gt;</code> is <code>mp_true</code> if <code>S</code> is a set, <code>mp_false</code> otherwise.</p>
  3948. </div>
  3949. </div>
  3950. <div class="sect3">
  3951. <h4 id="mp_set_containss_v">mp_set_contains&lt;S, V&gt;</h4>
  3952. <div class="literalblock">
  3953. <div class="content">
  3954. <pre>template&lt;class S, class V&gt; using mp_set_contains = /*...*/;</pre>
  3955. </div>
  3956. </div>
  3957. <div class="paragraph">
  3958. <p><code>mp_set_contains&lt;S, V&gt;</code> is <code>mp_true</code> if the type <code>V</code> is an element of the set <code>S</code>, <code>mp_false</code> otherwise.</p>
  3959. </div>
  3960. </div>
  3961. <div class="sect3">
  3962. <h4 id="mp_set_push_backs_t">mp_set_push_back&lt;S, T&#8230;&#8203;&gt;</h4>
  3963. <div class="literalblock">
  3964. <div class="content">
  3965. <pre>template&lt;class S, class... T&gt; using mp_set_push_back = /*...*/;</pre>
  3966. </div>
  3967. </div>
  3968. <div class="paragraph">
  3969. <p>For each <code>T1</code> in <code>T&#8230;&#8203;</code>, <code>mp_set_push_back&lt;S, T&#8230;&#8203;&gt;</code> appends <code>T1</code> to the end of the set <code>S</code> if it&#8217;s not already an element of <code>S</code>.</p>
  3970. </div>
  3971. </div>
  3972. <div class="sect3">
  3973. <h4 id="mp_set_push_fronts_t">mp_set_push_front&lt;S, T&#8230;&#8203;&gt;</h4>
  3974. <div class="literalblock">
  3975. <div class="content">
  3976. <pre>template&lt;class S, class... T&gt; using mp_set_push_front = /*...*/;</pre>
  3977. </div>
  3978. </div>
  3979. <div class="paragraph">
  3980. <p><code>mp_set_push_front&lt;S, T&#8230;&#8203;&gt;</code> inserts at the front of the set <code>S</code> those elements of <code>T&#8230;&#8203;</code> for which <code>S</code> does not already contain the same type.</p>
  3981. </div>
  3982. </div>
  3983. <div class="sect3">
  3984. <h4 id="mp_set_unionl">mp_set_union&lt;L&#8230;&#8203;&gt;</h4>
  3985. <div class="literalblock">
  3986. <div class="content">
  3987. <pre>template&lt;class... L&gt; using mp_set_union = /*...*/;</pre>
  3988. </div>
  3989. </div>
  3990. <div class="paragraph">
  3991. <p><code>mp_set_union&lt;S, L&#8230;&#8203;&gt;</code> is <code>mp_set_push_back&lt;S, T&#8230;&#8203;&gt;</code>, where <code>T&#8230;&#8203;</code> are the combined elements of the lists <code>L&#8230;&#8203;</code>.
  3992. <code>mp_set_union&lt;&gt;</code> is <code>mp_list&lt;&gt;</code>.</p>
  3993. </div>
  3994. </div>
  3995. <div class="sect3">
  3996. <h4 id="mp_set_intersections">mp_set_intersection&lt;S&#8230;&#8203;&gt;</h4>
  3997. <div class="literalblock">
  3998. <div class="content">
  3999. <pre>template&lt;class... S&gt; using mp_set_intersection = /*...*/;</pre>
  4000. </div>
  4001. </div>
  4002. <div class="paragraph">
  4003. <p><code>mp_set_intersection&lt;S&#8230;&#8203;&gt;</code> returns a set that contains the elements that occur in all of the sets <code>S&#8230;&#8203;</code>.
  4004. <code>mp_set_intersection&lt;&gt;</code> is <code>mp_list&lt;&gt;</code>.</p>
  4005. </div>
  4006. </div>
  4007. <div class="sect3">
  4008. <h4 id="mp_set_differencel_s">mp_set_difference&lt;L, S&#8230;&#8203;&gt;</h4>
  4009. <div class="literalblock">
  4010. <div class="content">
  4011. <pre>template&lt;class L, class... S&gt; using mp_set_difference = /*...*/;</pre>
  4012. </div>
  4013. </div>
  4014. <div class="paragraph">
  4015. <p><code>mp_set_difference&lt;L, S&#8230;&#8203;&gt;</code> removes the elements of the list <code>L</code> that appear in any of the sets <code>S&#8230;&#8203;</code> and
  4016. returns the result.</p>
  4017. </div>
  4018. </div>
  4019. </div>
  4020. <div class="sect2">
  4021. <h3 id="map">Map Operations, &lt;boost/mp11/map.hpp&gt;</h3>
  4022. <div class="paragraph">
  4023. <p>A map is a list of lists, the inner lists having at least one element (the key.) The keys of the map must be unique.</p>
  4024. </div>
  4025. <div class="sect3">
  4026. <h4 id="mp_is_mapm">mp_is_map&lt;M&gt;</h4>
  4027. <div class="literalblock">
  4028. <div class="content">
  4029. <pre>template&lt;class M&gt; using mp_is_map = /*...*/;</pre>
  4030. </div>
  4031. </div>
  4032. <div class="paragraph">
  4033. <p><code>mp_is_map&lt;M&gt;</code> is <code>mp_true</code> if <code>M</code> is a map, <code>mp_false</code> otherwise.</p>
  4034. </div>
  4035. </div>
  4036. <div class="sect3">
  4037. <h4 id="mp_map_findm_k">mp_map_find&lt;M, K&gt;</h4>
  4038. <div class="literalblock">
  4039. <div class="content">
  4040. <pre>template&lt;class M, class K&gt; using mp_map_find = /*...*/;</pre>
  4041. </div>
  4042. </div>
  4043. <div class="paragraph">
  4044. <p><code>mp_map_find&lt;M, K&gt;</code> is an alias for the element of the map <code>M</code> with a key <code>K</code>, or for <code>void</code>, if there is no such element.</p>
  4045. </div>
  4046. </div>
  4047. <div class="sect3">
  4048. <h4 id="mp_map_containsm_k">mp_map_contains&lt;M, K&gt;</h4>
  4049. <div class="literalblock">
  4050. <div class="content">
  4051. <pre>template&lt;class M, class K&gt; using mp_map_contains =
  4052. mp_not&lt;std::is_same&lt;mp_map_find&lt;M, K&gt;, void&gt;&gt;;</pre>
  4053. </div>
  4054. </div>
  4055. <div class="paragraph">
  4056. <p><code>mp_map_contains&lt;M, K&gt;</code> is <code>mp_true</code> if the map <code>M</code> contains an element with a key <code>K</code>, <code>mp_false</code> otherwise.</p>
  4057. </div>
  4058. </div>
  4059. <div class="sect3">
  4060. <h4 id="mp_map_insertm_t">mp_map_insert&lt;M, T&gt;</h4>
  4061. <div class="literalblock">
  4062. <div class="content">
  4063. <pre>template&lt;class M, class T&gt; using mp_map_insert =
  4064. mp_if&lt; mp_map_contains&lt;M, mp_first&lt;T&gt;&gt;, M, mp_push_back&lt;M, T&gt; &gt;;</pre>
  4065. </div>
  4066. </div>
  4067. <div class="paragraph">
  4068. <p>Inserts the element <code>T</code> into the map <code>M</code>, if an element with a key <code>mp_first&lt;T&gt;</code> is not already in <code>M</code>.</p>
  4069. </div>
  4070. </div>
  4071. <div class="sect3">
  4072. <h4 id="mp_map_replacem_t">mp_map_replace&lt;M, T&gt;</h4>
  4073. <div class="literalblock">
  4074. <div class="content">
  4075. <pre>template&lt;class M, class T&gt; using mp_map_replace = /*...*/;</pre>
  4076. </div>
  4077. </div>
  4078. <div class="paragraph">
  4079. <p>If the map <code>M</code> does not contain an element with a key <code>mp_first&lt;T&gt;</code>, inserts it (using <code>mp_push_back&lt;M, T&gt;</code>); otherwise,
  4080. replaces the existing element with <code>T</code>.</p>
  4081. </div>
  4082. </div>
  4083. <div class="sect3">
  4084. <h4 id="mp_map_updatem_t_f">mp_map_update&lt;M, T, F&gt;</h4>
  4085. <div class="literalblock">
  4086. <div class="content">
  4087. <pre>template&lt;class M, class T, template&lt;class...&gt; class F&gt; using mp_map_update = /*...*/;</pre>
  4088. </div>
  4089. </div>
  4090. <div class="paragraph">
  4091. <p>If the map <code>M</code> does not contain an element with a key <code>mp_first&lt;T&gt;</code>, inserts it (using <code>mp_push_back&lt;M, T&gt;</code>); otherwise,
  4092. replaces the existing element <code>L&lt;X, Y&#8230;&#8203;&gt;</code> with <code>L&lt;X, F&lt;X, Y&#8230;&#8203;&gt;&gt;</code>.</p>
  4093. </div>
  4094. <div class="listingblock">
  4095. <div class="title">Code Example 65. Using mp_map_update to count the number of occurrences of types in a list</div>
  4096. <div class="content">
  4097. <pre class="highlight"><code>template&lt;class T, class U&gt; using inc2nd = mp_int&lt;U::value + 1&gt;;
  4098. template&lt;class M, class T&gt; using count_types =
  4099. mp_map_update&lt;M, std::pair&lt;T, mp_int&lt;1&gt;&gt;, inc2nd&gt;;
  4100. using L1 = mp_list&lt;float, char, float, float, float, float, char, float&gt;;
  4101. using R1 = mp_fold&lt;L1, std::tuple&lt;&gt;, count_types&gt;;
  4102. // std::tuple&lt;std::pair&lt;float, mp_int&lt;6&gt;&gt;, std::pair&lt;char, mp_int&lt;2&gt;&gt;&gt;</code></pre>
  4103. </div>
  4104. </div>
  4105. </div>
  4106. <div class="sect3">
  4107. <h4 id="mp_map_update_qm_t_q">mp_map_update_q&lt;M, T, Q&gt;</h4>
  4108. <div class="literalblock">
  4109. <div class="content">
  4110. <pre>template&lt;class M, class T, class Q&gt; using mp_map_update_q =
  4111. mp_map_update&lt;M, T, Q::template fn&gt;;</pre>
  4112. </div>
  4113. </div>
  4114. <div class="paragraph">
  4115. <p>As <code>mp_map_update</code>, but takes a quoted metafunction.</p>
  4116. </div>
  4117. </div>
  4118. <div class="sect3">
  4119. <h4 id="mp_map_erasem_k">mp_map_erase&lt;M, K&gt;</h4>
  4120. <div class="literalblock">
  4121. <div class="content">
  4122. <pre>template&lt;class M, class K&gt; using mp_map_erase = /*...*/;</pre>
  4123. </div>
  4124. </div>
  4125. <div class="paragraph">
  4126. <p>If the map <code>M</code> contains an element with a key <code>K</code>, removes it.</p>
  4127. </div>
  4128. </div>
  4129. <div class="sect3">
  4130. <h4 id="mp_map_keysm">mp_map_keys&lt;M&gt;</h4>
  4131. <div class="literalblock">
  4132. <div class="content">
  4133. <pre>template&lt;class M&gt; using mp_map_keys = mp_transform&lt;mp_first, M&gt;;</pre>
  4134. </div>
  4135. </div>
  4136. <div class="paragraph">
  4137. <p><code>mp_map_keys&lt;M&gt;</code> returns a list of the keys of <code>M</code>. When <code>M</code> is a valid map, the keys are unique, so the result is a set.</p>
  4138. </div>
  4139. </div>
  4140. </div>
  4141. <div class="sect2">
  4142. <h3 id="function">Helper Metafunctions, &lt;boost/mp11/function.hpp&gt;</h3>
  4143. <div class="sect3">
  4144. <h4 id="mp_voidt">mp_void&lt;T&#8230;&#8203;&gt;</h4>
  4145. <div class="literalblock">
  4146. <div class="content">
  4147. <pre>template&lt;class... T&gt; using mp_void = void;</pre>
  4148. </div>
  4149. </div>
  4150. <div class="paragraph">
  4151. <p>Same as <code>std::void_t</code> from C++17.</p>
  4152. </div>
  4153. </div>
  4154. <div class="sect3">
  4155. <h4 id="mp_andt">mp_and&lt;T&#8230;&#8203;&gt;</h4>
  4156. <div class="literalblock">
  4157. <div class="content">
  4158. <pre>template&lt;class... T&gt; using mp_and = /*...*/;</pre>
  4159. </div>
  4160. </div>
  4161. <div class="paragraph">
  4162. <p><code>mp_and&lt;T&#8230;&#8203;&gt;</code> applies <code>mp_to_bool</code> to the types in <code>T&#8230;&#8203;</code>, in order. If the result of an application is <code>mp_false</code>, <code>mp_and</code>
  4163. returns <code>mp_false</code>. If the application causes a substitution failure, returns <code>mp_false</code>. If all results are <code>mp_true</code>,
  4164. returns <code>mp_true</code>. <code>mp_and&lt;&gt;</code> is <code>mp_true</code>.</p>
  4165. </div>
  4166. <div class="listingblock">
  4167. <div class="title">Code Example 66. mp_and behavior</div>
  4168. <div class="content">
  4169. <pre class="highlight"><code>using R1 = mp_and&lt;mp_true, mp_true&gt;; // mp_true
  4170. using R2 = mp_and&lt;mp_false, void&gt;; // mp_false, void is not reached
  4171. using R3 = mp_and&lt;mp_false, mp_false&gt;; // mp_false
  4172. using R4 = mp_and&lt;void, mp_true&gt;; // mp_false (!)</code></pre>
  4173. </div>
  4174. </div>
  4175. </div>
  4176. <div class="sect3">
  4177. <h4 id="mp_allt">mp_all&lt;T&#8230;&#8203;&gt;</h4>
  4178. <div class="literalblock">
  4179. <div class="content">
  4180. <pre>template&lt;class... T&gt; using mp_all = /*...*/;</pre>
  4181. </div>
  4182. </div>
  4183. <div class="paragraph">
  4184. <p><code>mp_all&lt;T&#8230;&#8203;&gt;</code> is <code>mp_true</code> if <code>mp_to_bool&lt;U&gt;</code> is <code>mp_true</code> for all types <code>U</code> in <code>T&#8230;&#8203;</code>, <code>mp_false</code> otherwise. Same as
  4185. <code>mp_and</code>, but does not perform short-circuit evaluation. <code>mp_and&lt;mp_false, void&gt;</code> is <code>mp_false</code>, but <code>mp_all&lt;mp_false, void&gt;</code>
  4186. is an error because <code>void</code> does not have a nested <code>value</code>. The upside is that <code>mp_all</code> is potentially faster and does not
  4187. mask substitution failures as <code>mp_and</code> does.</p>
  4188. </div>
  4189. <div class="listingblock">
  4190. <div class="title">Code Example 67. mp_all behavior</div>
  4191. <div class="content">
  4192. <pre class="highlight"><code>using R1 = mp_all&lt;mp_true, mp_true&gt;; // mp_true
  4193. using R2 = mp_all&lt;mp_false, void&gt;; // compile-time error
  4194. using R3 = mp_all&lt;mp_false, mp_false&gt;; // mp_false
  4195. using R4 = mp_all&lt;void, mp_true&gt;; // compile-time error</code></pre>
  4196. </div>
  4197. </div>
  4198. </div>
  4199. <div class="sect3">
  4200. <h4 id="mp_ort">mp_or&lt;T&#8230;&#8203;&gt;</h4>
  4201. <div class="literalblock">
  4202. <div class="content">
  4203. <pre>template&lt;class... T&gt; using mp_or = /*...*/;</pre>
  4204. </div>
  4205. </div>
  4206. <div class="paragraph">
  4207. <p><code>mp_or&lt;T&#8230;&#8203;&gt;</code> applies <code>mp_to_bool</code> to the types in <code>T&#8230;&#8203;</code>, in order. If the result of an application is <code>mp_true</code>, <code>mp_or</code>
  4208. returns <code>mp_true</code>. If all results are <code>mp_false</code>, returns <code>mp_false</code>. <code>mp_or&lt;&gt;</code> is <code>mp_false</code>.</p>
  4209. </div>
  4210. <div class="listingblock">
  4211. <div class="title">Code Example 68. mp_or behavior</div>
  4212. <div class="content">
  4213. <pre class="highlight"><code>using R1 = mp_or&lt;mp_true, mp_false&gt;; // mp_true
  4214. using R2 = mp_or&lt;mp_true, void&gt;; // mp_true, void is not reached
  4215. using R3 = mp_or&lt;mp_false, mp_false&gt;; // mp_false
  4216. using R4 = mp_or&lt;void, mp_true&gt;; // compile-time error</code></pre>
  4217. </div>
  4218. </div>
  4219. </div>
  4220. <div class="sect3">
  4221. <h4 id="mp_anyt">mp_any&lt;T&#8230;&#8203;&gt;</h4>
  4222. <div class="literalblock">
  4223. <div class="content">
  4224. <pre>template&lt;class... T&gt; using mp_any = /*...*/;</pre>
  4225. </div>
  4226. </div>
  4227. <div class="paragraph">
  4228. <p><code>mp_any&lt;T&#8230;&#8203;&gt;</code> is <code>mp_true</code> if <code>mp_to_bool&lt;U&gt;</code> is <code>mp_true</code> for any type <code>U</code> in <code>T&#8230;&#8203;</code>, <code>mp_false</code> otherwise. Same as
  4229. <code>mp_or</code>, but does not perform short-circuit evaluation.</p>
  4230. </div>
  4231. <div class="listingblock">
  4232. <div class="title">Code Example 69. mp_any behavior</div>
  4233. <div class="content">
  4234. <pre class="highlight"><code>using R1 = mp_any&lt;mp_true, mp_false&gt;; // mp_true
  4235. using R2 = mp_any&lt;mp_true, void&gt;; // compile-time error
  4236. using R3 = mp_any&lt;mp_false, mp_false&gt;; // mp_false
  4237. using R4 = mp_any&lt;void, mp_true&gt;; // compile-time error</code></pre>
  4238. </div>
  4239. </div>
  4240. </div>
  4241. <div class="sect3">
  4242. <h4 id="mp_samet">mp_same&lt;T&#8230;&#8203;&gt;</h4>
  4243. <div class="literalblock">
  4244. <div class="content">
  4245. <pre>template&lt;class... T&gt; using mp_same = /*...*/;</pre>
  4246. </div>
  4247. </div>
  4248. <div class="paragraph">
  4249. <p><code>mp_same&lt;T&#8230;&#8203;&gt;</code> is <code>mp_true</code> if all the types in <code>T&#8230;&#8203;</code> are the same type, <code>mp_false</code> otherwise. <code>mp_same&lt;&gt;</code> is <code>mp_true</code>.</p>
  4250. </div>
  4251. </div>
  4252. <div class="sect3">
  4253. <h4 id="mp_similart">mp_similar&lt;T&#8230;&#8203;&gt;</h4>
  4254. <div class="literalblock">
  4255. <div class="content">
  4256. <pre>template&lt;class... T&gt; using mp_similar = /*...*/;</pre>
  4257. </div>
  4258. </div>
  4259. <div class="paragraph">
  4260. <p><code>mp_similar&lt;T&#8230;&#8203;&gt;</code> is <code>mp_true</code> if all the types in <code>T&#8230;&#8203;</code> are the same type, or instantiations of the same class template
  4261. whose parameters are all types, <code>mp_false</code> otherwise. <code>mp_similar&lt;&gt;</code> is <code>mp_true</code>.</p>
  4262. </div>
  4263. <div class="listingblock">
  4264. <div class="title">Code Example 70. mp_similar</div>
  4265. <div class="content">
  4266. <pre class="highlight"><code>using R1 = mp_similar&lt;void&gt;; // mp_true
  4267. using R2 = mp_similar&lt;void, void&gt;; // mp_true
  4268. using R3 = mp_similar&lt;void, void, void&gt;; // mp_true
  4269. using R4 = mp_similar&lt;void, void, float&gt;; // mp_false
  4270. template&lt;class T&gt; struct X;
  4271. template&lt;class... T&gt; struct Y;
  4272. using R5 = mp_similar&lt;X&lt;int&gt;, X&lt;void&gt;, X&lt;float&gt;&gt;; // mp_true
  4273. using R6 = mp_similar&lt;Y&lt;&gt;, Y&lt;void&gt;, Y&lt;void, void&gt;&gt;; // mp_true
  4274. using R7 = mp_similar&lt;X&lt;void&gt;, Y&lt;void&gt;&gt;; // mp_false</code></pre>
  4275. </div>
  4276. </div>
  4277. </div>
  4278. <div class="sect3">
  4279. <h4 id="mp_plust">mp_plus&lt;T&#8230;&#8203;&gt;</h4>
  4280. <div class="literalblock">
  4281. <div class="content">
  4282. <pre>template&lt;class... T&gt; using mp_plus = /*...*/;</pre>
  4283. </div>
  4284. </div>
  4285. <div class="paragraph">
  4286. <p><code>mp_plus&lt;T&#8230;&#8203;&gt;</code> is an integral constant type with a value that is the sum of <code>U::value</code> for all types <code>U</code> in <code>T&#8230;&#8203;</code>.
  4287. <code>mp_plus&lt;&gt;</code> is <code>mp_int&lt;0&gt;</code>.</p>
  4288. </div>
  4289. </div>
  4290. <div class="sect3">
  4291. <h4 id="mp_lesst1_t2">mp_less&lt;T1, T2&gt;</h4>
  4292. <div class="literalblock">
  4293. <div class="content">
  4294. <pre>template&lt;class T1, class T2&gt; using mp_less = /*...*/;</pre>
  4295. </div>
  4296. </div>
  4297. <div class="paragraph">
  4298. <p><code>mp_less&lt;T1, T2&gt;</code> is <code>mp_true</code> when the numeric value of <code>T1::value</code> is less than the numeric value of <code>T2::value</code>,
  4299. <code>mp_false</code> otherwise.</p>
  4300. </div>
  4301. <div class="paragraph">
  4302. <p>(Note that this is not necessarily the same as <code>T1::value &lt; T2::value</code> when comparing between signed and unsigned types;
  4303. <code>-1 &lt; 1u</code> is <code>false</code>, but <code>mp_less&lt;mp_int&lt;-1&gt;, mp_size_t&lt;1&gt;&gt;</code> is <code>mp_true</code>.)</p>
  4304. </div>
  4305. </div>
  4306. <div class="sect3">
  4307. <h4 id="mp_mint1_t">mp_min&lt;T1, T&#8230;&#8203;&gt;</h4>
  4308. <div class="literalblock">
  4309. <div class="content">
  4310. <pre>template&lt;class T1, class... T&gt; using mp_min = mp_min_element&lt;mp_list&lt;T1, T...&gt;, mp_less&gt;;</pre>
  4311. </div>
  4312. </div>
  4313. <div class="paragraph">
  4314. <p><code>mp_min&lt;T&#8230;&#8203;&gt;</code> returns the type <code>U</code> in <code>T&#8230;&#8203;</code> with the lowest <code>U::value</code>.</p>
  4315. </div>
  4316. </div>
  4317. <div class="sect3">
  4318. <h4 id="mp_maxt1_t">mp_max&lt;T1, T&#8230;&#8203;&gt;</h4>
  4319. <div class="literalblock">
  4320. <div class="content">
  4321. <pre>template&lt;class T1, class... T&gt; using mp_max = mp_max_element&lt;mp_list&lt;T1, T...&gt;, mp_less&gt;;</pre>
  4322. </div>
  4323. </div>
  4324. <div class="paragraph">
  4325. <p><code>mp_max&lt;T&#8230;&#8203;&gt;</code> returns the type <code>U</code> in <code>T&#8230;&#8203;</code> with the highest <code>U::value</code>.</p>
  4326. </div>
  4327. </div>
  4328. </div>
  4329. <div class="sect2">
  4330. <h3 id="bind">Bind, &lt;boost/mp11/bind.hpp&gt;</h3>
  4331. <div class="sect3">
  4332. <h4 id="mp_argi">mp_arg&lt;I&gt;</h4>
  4333. <div class="literalblock">
  4334. <div class="content">
  4335. <pre>template&lt;std::size_t I&gt; struct mp_arg;</pre>
  4336. </div>
  4337. </div>
  4338. <div class="paragraph">
  4339. <p><code>mp_arg&lt;I&gt;</code> is a quoted metafunction whose nested template <code>fn&lt;T&#8230;&#8203;&gt;</code> returns the <code>I</code>-th zero-based element of <code>T&#8230;&#8203;</code>.</p>
  4340. </div>
  4341. </div>
  4342. <div class="sect3">
  4343. <h4 id="1_9">_1, &#8230;&#8203;, _9</h4>
  4344. <div class="literalblock">
  4345. <div class="content">
  4346. <pre>using _1 = mp_arg&lt;0&gt;;
  4347. using _2 = mp_arg&lt;1&gt;;
  4348. using _3 = mp_arg&lt;2&gt;;
  4349. using _4 = mp_arg&lt;3&gt;;
  4350. using _5 = mp_arg&lt;4&gt;;
  4351. using _6 = mp_arg&lt;5&gt;;
  4352. using _7 = mp_arg&lt;6&gt;;
  4353. using _8 = mp_arg&lt;7&gt;;
  4354. using _9 = mp_arg&lt;8&gt;;</pre>
  4355. </div>
  4356. </div>
  4357. <div class="paragraph">
  4358. <p><code>_1</code> to <code>_9</code> are placeholder types, the equivalent to the placeholders of <code>boost::bind</code>.</p>
  4359. </div>
  4360. </div>
  4361. <div class="sect3">
  4362. <h4 id="mp_bindf_t">mp_bind&lt;F, T&#8230;&#8203;&gt;</h4>
  4363. <div class="literalblock">
  4364. <div class="content">
  4365. <pre>template&lt;template&lt;class...&gt; class F, class... T&gt; struct mp_bind;</pre>
  4366. </div>
  4367. </div>
  4368. <div class="paragraph">
  4369. <p><code>mp_bind&lt;F, T&#8230;&#8203;&gt;</code> is a quoted metafunction that implements the type-based
  4370. equivalent of <code>boost::bind</code>. Its nested template <code>fn&lt;U&#8230;&#8203;&gt;</code> returns <code>F&lt;V&#8230;&#8203;&gt;</code>,
  4371. where <code>V&#8230;&#8203;</code> is <code>T&#8230;&#8203;</code> with the placeholders replaced by the corresponding
  4372. element of <code>U&#8230;&#8203;</code> and the <code>mp_bind</code>, <code>mp_bind_front</code>, and <code>mp_bind_back</code>
  4373. expressions replaced with their corresponding evaluations against <code>U&#8230;&#8203;</code>.</p>
  4374. </div>
  4375. <div class="paragraph">
  4376. <p>For example, <code>mp_bind&lt;F, int, _2, mp_bind&lt;G, _1&gt;&gt;::fn&lt;float, void&gt;</code> is <code>F&lt;int, void, G&lt;float&gt;&gt;</code>.</p>
  4377. </div>
  4378. </div>
  4379. <div class="sect3">
  4380. <h4 id="mp_bind_qq_t">mp_bind_q&lt;Q, T&#8230;&#8203;&gt;</h4>
  4381. <div class="literalblock">
  4382. <div class="content">
  4383. <pre>template&lt;class Q, class... T&gt; using mp_bind_q = mp_bind&lt;Q::template fn, T...&gt;;</pre>
  4384. </div>
  4385. </div>
  4386. <div class="paragraph">
  4387. <p>As <code>mp_bind</code>, but takes a quoted metafunction.</p>
  4388. </div>
  4389. </div>
  4390. <div class="sect3">
  4391. <h4 id="mp_bind_frontf_t">mp_bind_front&lt;F, T&#8230;&#8203;&gt;</h4>
  4392. <div class="literalblock">
  4393. <div class="content">
  4394. <pre>template&lt;template&lt;class...&gt; class F, class... T&gt; struct mp_bind_front;</pre>
  4395. </div>
  4396. </div>
  4397. <div class="paragraph">
  4398. <p><code>mp_bind_front&lt;F, T&#8230;&#8203;&gt;</code> binds the leftmost arguments of <code>F</code> to <code>T&#8230;&#8203;</code>. Its nested template <code>fn&lt;U&#8230;&#8203;&gt;</code> returns <code>F&lt;T&#8230;&#8203;, U&#8230;&#8203;&gt;</code>.</p>
  4399. </div>
  4400. </div>
  4401. <div class="sect3">
  4402. <h4 id="mp_bind_front_qq_t">mp_bind_front_q&lt;Q, T&#8230;&#8203;&gt;</h4>
  4403. <div class="literalblock">
  4404. <div class="content">
  4405. <pre>template&lt;class Q, class... T&gt; using mp_bind_front_q =
  4406. mp_bind_front&lt;Q::template fn, T...&gt;;</pre>
  4407. </div>
  4408. </div>
  4409. <div class="paragraph">
  4410. <p>As <code>mp_bind_front</code>, but takes a quoted metafunction.</p>
  4411. </div>
  4412. </div>
  4413. <div class="sect3">
  4414. <h4 id="mp_bind_backf_t">mp_bind_back&lt;F, T&#8230;&#8203;&gt;</h4>
  4415. <div class="literalblock">
  4416. <div class="content">
  4417. <pre>template&lt;template&lt;class...&gt; class F, class... T&gt; struct mp_bind_back;</pre>
  4418. </div>
  4419. </div>
  4420. <div class="paragraph">
  4421. <p><code>mp_bind_back&lt;F, T&#8230;&#8203;&gt;</code> binds the rightmost arguments of <code>F</code> to <code>T&#8230;&#8203;</code>. Its nested template <code>fn&lt;U&#8230;&#8203;&gt;</code> returns <code>F&lt;U&#8230;&#8203;, T&#8230;&#8203;&gt;</code>.</p>
  4422. </div>
  4423. </div>
  4424. <div class="sect3">
  4425. <h4 id="mp_bind_back_qq_t">mp_bind_back_q&lt;Q, T&#8230;&#8203;&gt;</h4>
  4426. <div class="literalblock">
  4427. <div class="content">
  4428. <pre>template&lt;class Q, class... T&gt; using mp_bind_back_q =
  4429. mp_bind_back&lt;Q::template fn, T...&gt;;</pre>
  4430. </div>
  4431. </div>
  4432. <div class="paragraph">
  4433. <p>As <code>mp_bind_back</code>, but takes a quoted metafunction.</p>
  4434. </div>
  4435. </div>
  4436. </div>
  4437. <div class="sect2">
  4438. <h3 id="integer_sequence">Integer Sequences, &lt;boost/mp11/integer_sequence.hpp&gt;</h3>
  4439. <div class="sect3">
  4440. <h4 id="integer_sequencet_i">integer_sequence&lt;T, I&#8230;&#8203;&gt;</h4>
  4441. <div class="literalblock">
  4442. <div class="content">
  4443. <pre>template&lt;class T, T... I&gt; struct integer_sequence
  4444. {
  4445. };</pre>
  4446. </div>
  4447. </div>
  4448. <div class="paragraph">
  4449. <p><code>integer_sequence&lt;T, I&#8230;&#8203;&gt;</code> holds a sequence of integers of type <code>T</code>. Same as C++14&#8217;s <code>std::integer_sequence</code>.</p>
  4450. </div>
  4451. </div>
  4452. <div class="sect3">
  4453. <h4 id="make_integer_sequencet_n">make_integer_sequence&lt;T, N&gt;</h4>
  4454. <div class="literalblock">
  4455. <div class="content">
  4456. <pre>template&lt;class T, T N&gt; using make_integer_sequence = /*...*/;</pre>
  4457. </div>
  4458. </div>
  4459. <div class="paragraph">
  4460. <p><code>make_integer_sequence&lt;T, N&gt;</code> is <code>integer_sequence&lt;T, 0, 1, &#8230;&#8203;, N-1&gt;</code>. Same as C++14&#8217;s <code>std::make_integer_sequence</code>.</p>
  4461. </div>
  4462. </div>
  4463. <div class="sect3">
  4464. <h4 id="index_sequencei">index_sequence&lt;I&#8230;&#8203;&gt;</h4>
  4465. <div class="literalblock">
  4466. <div class="content">
  4467. <pre>template&lt;std::size_t... I&gt; using index_sequence = integer_sequence&lt;std::size_t, I...&gt;;</pre>
  4468. </div>
  4469. </div>
  4470. <div class="paragraph">
  4471. <p><code>index_sequence&lt;I&#8230;&#8203;&gt;</code> is an alias for <code>integer_sequence&lt;size_t, I&#8230;&#8203;&gt;</code>. Same as C++14&#8217;s <code>std::index_sequence</code>.</p>
  4472. </div>
  4473. </div>
  4474. <div class="sect3">
  4475. <h4 id="make_index_sequencen">make_index_sequence&lt;N&gt;</h4>
  4476. <div class="literalblock">
  4477. <div class="content">
  4478. <pre>template&lt;std::size_t N&gt; using make_index_sequence =
  4479. make_integer_sequence&lt;std::size_t, N&gt;;</pre>
  4480. </div>
  4481. </div>
  4482. <div class="paragraph">
  4483. <p><code>make_index_sequence&lt;N&gt;</code> is <code>index_sequence&lt;0, 1, &#8230;&#8203;, N-1&gt;</code>. Same as C++14&#8217;s <code>std::make_index_sequence</code>.</p>
  4484. </div>
  4485. </div>
  4486. <div class="sect3">
  4487. <h4 id="index_sequence_fort">index_sequence_for&lt;T&#8230;&#8203;&gt;</h4>
  4488. <div class="literalblock">
  4489. <div class="content">
  4490. <pre>template&lt;class... T&gt; using index_sequence_for =
  4491. make_integer_sequence&lt;std::size_t, sizeof...(T)&gt;;</pre>
  4492. </div>
  4493. </div>
  4494. <div class="paragraph">
  4495. <p><code>index_sequence_for&lt;N&gt;</code> is <code>make_index_sequence&lt;sizeof&#8230;&#8203;(T)&gt;</code>. Same as C++14&#8217;s <code>std::index_sequence_for</code>.</p>
  4496. </div>
  4497. </div>
  4498. </div>
  4499. <div class="sect2">
  4500. <h3 id="tuple">Tuple Operations, &lt;boost/mp11/tuple.hpp&gt;</h3>
  4501. <div class="sect3">
  4502. <h4 id="tuple_applyf_tp">tuple_apply(f, tp)</h4>
  4503. <div class="literalblock">
  4504. <div class="content">
  4505. <pre>template&lt;class F, class Tp&gt; constexpr /*...*/ tuple_apply(F&amp;&amp; f, Tp&amp;&amp; tp);</pre>
  4506. </div>
  4507. </div>
  4508. <div class="paragraph">
  4509. <p><code>tuple_apply(f, tp)</code> returns <code>std::forward&lt;F&gt;(f)(std::get&lt;J&gt;(std::forward&lt;Tp&gt;(tp))&#8230;&#8203;)</code> for <code>J</code> in 0..<code>N-1</code>,
  4510. where <code>N</code> is <code>std::tuple_size&lt;typename std::remove_reference&lt;Tp&gt;::type&gt;::value</code>. Same as <code>std::apply</code> in C++17.</p>
  4511. </div>
  4512. </div>
  4513. <div class="sect3">
  4514. <h4 id="construct_from_tuplettp">construct_from_tuple&lt;T&gt;(tp)</h4>
  4515. <div class="literalblock">
  4516. <div class="content">
  4517. <pre>template&lt;class T, class Tp&gt; T construct_from_tuple(Tp&amp;&amp; tp);</pre>
  4518. </div>
  4519. </div>
  4520. <div class="paragraph">
  4521. <p><code>construct_from_tuple&lt;T&gt;(tp)</code> returns <code>T(std::get&lt;J&gt;(std::forward&lt;Tp&gt;(tp))&#8230;&#8203;)</code> for <code>J</code> in 0..<code>N-1</code>,
  4522. where <code>N</code> is <code>std::tuple_size&lt;typename std::remove_reference&lt;Tp&gt;::type&gt;::value</code>. Same as <code>std::make_from_tuple</code> in C&#43;&#43;17.
  4523. The name of the function doesn&#8217;t match the C&#43;&#43;17 one to avoid ambiguities when both are visible or in unqualified calls.</p>
  4524. </div>
  4525. </div>
  4526. <div class="sect3">
  4527. <h4 id="tuple_for_eachtp_f">tuple_for_each(tp, f)</h4>
  4528. <div class="literalblock">
  4529. <div class="content">
  4530. <pre>template&lt;class Tp, class F&gt; constexpr F tuple_for_each(Tp&amp;&amp; tp, F&amp;&amp; f);</pre>
  4531. </div>
  4532. </div>
  4533. <div class="paragraph">
  4534. <p><code>tuple_for_each(tp, f)</code> applies the function object <code>f</code> to each element of <code>tp</code> by evaluating the
  4535. expression <code>f(std::get&lt;J&gt;(std::forward&lt;Tp&gt;(tp)))</code> for <code>J</code> in 0..<code>N-1</code>, where <code>N</code> is <code>std::tuple_size&lt;typename std::remove_reference&lt;Tp&gt;::type&gt;::value</code>.</p>
  4536. </div>
  4537. <div class="paragraph">
  4538. <p>Returns <code>std::forward&lt;F&gt;(f)</code>.</p>
  4539. </div>
  4540. </div>
  4541. </div>
  4542. <div class="sect2">
  4543. <h3 id="mp11">Convenience Header, &lt;boost/mp11.hpp&gt;</h3>
  4544. <div class="paragraph">
  4545. <p>The convenience header <code>&lt;boost/mp11.hpp&gt;</code> includes all of the
  4546. headers listed previously in this reference.</p>
  4547. </div>
  4548. </div>
  4549. <div class="sect2">
  4550. <h3 id="mpl">MPL Support, &lt;boost/mp11/mpl.hpp&gt;</h3>
  4551. <div class="paragraph">
  4552. <p>The header <code>&lt;boost/mp11/mpl.hpp&gt;</code>, when included, defines the
  4553. necessary support infrastructure for <code>mp_list</code> and <code>std::tuple</code>
  4554. to be valid <a href="../../../../libs/mpl">MPL</a> sequences.</p>
  4555. </div>
  4556. <div class="admonitionblock note">
  4557. <table>
  4558. <tr>
  4559. <td class="icon">
  4560. <div class="title">Note</div>
  4561. </td>
  4562. <td class="content">
  4563. <code>mpl.hpp</code> is not included by <code>&lt;boost/mp11.hpp&gt;</code>.
  4564. </td>
  4565. </tr>
  4566. </table>
  4567. </div>
  4568. <div class="paragraph">
  4569. <p>It&#8217;s also possible to only enable support for <code>mp_list</code> by
  4570. including <code>&lt;boost/mp11/mpl_list.hpp&gt;</code>, and for <code>std::tuple</code>
  4571. by including <code>&lt;boost/mp11/mpl_tuple.hpp&gt;</code>. This may be required
  4572. because some libraries, such as Boost.Fusion, contain their own MPL
  4573. support for <code>std::tuple</code>, which conflicts with Mp11&#8217;s one.</p>
  4574. </div>
  4575. </div>
  4576. </div>
  4577. </div>
  4578. <div class="sect1">
  4579. <h2 id="copyright_license_and_acknowledgments">Appendix A: Copyright, License, and Acknowledgments</h2>
  4580. <div class="sectionbody">
  4581. <div class="paragraph">
  4582. <p>This documentation is</p>
  4583. </div>
  4584. <div class="ulist">
  4585. <ul>
  4586. <li>
  4587. <p>Copyright 2017-2019 Peter Dimov</p>
  4588. </li>
  4589. <li>
  4590. <p>Copyright 2017 Bjørn Reese</p>
  4591. </li>
  4592. </ul>
  4593. </div>
  4594. <div class="paragraph">
  4595. <p>and is distributed under the <a href="http://www.boost.org/LICENSE_1_0.txt">Boost Software License, Version 1.0</a>.</p>
  4596. </div>
  4597. <div class="paragraph">
  4598. <p>The "Simple C&#43;&#43;11 metaprogramming" articles have been graciously converted to Asciidoc format for incorporation
  4599. into this documentation by Glen Fernandes.</p>
  4600. </div>
  4601. </div>
  4602. </div>
  4603. </div>
  4604. <div id="footer">
  4605. <div id="footer-text">
  4606. Last updated 2019-12-10 00:19:27 UTC
  4607. </div>
  4608. </div>
  4609. <style>
  4610. *:not(pre)>code { background: none; color: #600000; }
  4611. :not(pre):not([class^=L])>code { background: none; color: #600000; }
  4612. table tr.even, table tr.alt, table tr:nth-of-type(even) { background: none; }
  4613. </style>
  4614. </body>
  4615. </html>