ãã®ç¿»èš³ãå
¬éããããã«ã
@ encyclopedistã®æè¿ã®èšäº
ããã¡ã¯ããªãŒã¡ãœããïŒåçã¡ã¢ãªå²ãåœãŠãªãïŒã ã«å¯Ÿããã³ã¡ã³ãã«
åæ©ä»ããããŸããã ãã®èšäºã«ã¯èå³ããããŸããããç°¡åãª
ã°ãŒã°ã«æ€çŽ¢ã§ã¯ç¿»èš³ãæããã«ãªããŸããã§ããã ãç¡ç§©åºãããšæã£ãããC ++ã«é¢ãããã®ãããªèå³æ·±ãèšäºã¯ãã·ã¢èªã«ç¿»èš³ãããŠããªãã ä¿®æ£ããå¿
èŠããããŸããã
ç®æ¬¡- ã¯ããã«
- èšèš
- å®è£
- ãŸã èšãããŠããªãããš
Eggs.Variantã®éçºã«é¢ãã
èå¯ ã
C ++ 11/14ã®äžè¬çãªã¿ã€ãã»ãŒã
ããŒã¯ã¢ããçµå ã
ã¯ããã«
ãŠããªã³ã¯ãééçã¡ã³ããŒã®1ã€ã ããäžåºŠã«æ ŒçŽã§ããç¹å¥ãªçš®é¡ã®ã¯ã©ã¹ã§ãã æ倧ã®ã¡ã³ããŒãå容ããããã«å¿
èŠãªã¹ããŒã¹ãå æããŸãã
9 [class] / 5 Unionã¯ã union
ããŒã¯ãŒãã§å®çŸ©ãããã¯ã©ã¹ã§ãã åæã«ã圌ã¯ã¡ã³ããŒã®1人ïŒ9.5ïŒã®ã¿ãä¿æã§ããŸãã [...]
9.5 [class.union] / 1ãŠããªã³ã§ã¢ã¯ãã£ãã«ã§ããééçã¡ã³ããŒã¯1ã€ã ãã§ããã€ãŸãããŠããªã³å
ã®ç¹å®ã®æç¹ã§ã¯ããã®ééçã¡ã³ããŒã®1ã€ã ããæ ŒçŽã§ããŸãã [...]ããŒã«ã®ãµã€ãºã¯ããã®æ倧ã®ééçã¡ã³ããŒãå容ããã®ã«ååã§ãã åééçã¡ã³ããŒã¯ãããããæ§é äœã®å¯äžã®ã¡ã³ããŒã§ãããã®ããã«ã¡ã¢ãªã«ä¿åãããŸãã ãŠããªã³ãªããžã§ã¯ãã®ééçã¡ã³ããŒã¯ãã¹ãŠåãã¢ãã¬ã¹ãæã¡ãŸãã
ãªãªãžãã«9 [ã¯ã©ã¹] / 5ãŠããªã³ã¯ãã¯ã©ã¹ããŒãŠããªã³ã§å®çŸ©ãããã¯ã©ã¹ã§ãã äžåºŠã«æ倧1ã€ã®ããŒã¿ã¡ã³ããŒãä¿æããŸãïŒ9.5ïŒã [...]
9.5 [class.union] / 1ãŠããªã³ã§ã¯ãæ倧ã§1ã€ã®ééçããŒã¿ã¡ã³ããŒããã€ã§ãã¢ã¯ãã£ãã«ã§ããŸããã€ãŸããæ倧ã§1ã€ã®ééçããŒã¿ã¡ã³ããŒã®å€ããã€ã§ãçµåã [...]ãŠããªã³ã®ãµã€ãºã¯ãæ倧ã®ééçããŒã¿ã¡ã³ããŒãå«ããã®ã«ååã§ãã åééçããŒã¿ã¡ã³ããŒã¯ãæ§é äœã®å¯äžã®ã¡ã³ããŒã§ãããã®ããã«å²ãåœãŠãããŸãã ãŠããªã³ãªããžã§ã¯ãã®ãã¹ãŠã®ééçããŒã¿ã¡ã³ããŒã¯åãã¢ãã¬ã¹ãæã¡ãŸãã
C ++ 98ã§ã¯ãå
±çšäœã¡ã³ããŒã¯åçŽãªãªããžã§ã¯ãåã«å¶éãããŠããŸãã ãããã®ã¿ã€ãã®å Žåããããã®ã©ã€ãã¿ã€ã ã¯ã
ãªããžããªãåä¿¡ããããšå§ãŸããåå©çšãŸãã¯ãªãªãŒã¹ããããšçµäºããŸãã
3.8 [basic.life] / 1 [...]ã¿ã€ãT
ãªããžã§ã¯ãã®ã©ã€ãã¿ã€ã ã¯ã次ã®å Žåã«å§ãŸããŸãã
- ã¿ã€ã
T
ã¢ã©ã€ã¡ã³ããšãµã€ãºãæã€ãªããžããªãååŸããã - ãªããžã§ã¯ãã®åæåã¯ããããéèŠãªå Žåãå®äºããŸãã
ã¿ã€ãT
ãªããžã§ã¯ãã®ã©ã€ãã¿ã€ã ã¯ã次ã®å Žåã«çµäºããŸãã
T
ãéèªæãªãã¹ãã©ã¯ã¿ïŒ12.4ïŒãæã€ã¯ã©ã¹åã®å Žåããã¹ãã©ã¯ã¿ã®åŒã³åºããéå§ãããŸãããŸãã¯- ãªããžã§ã¯ããå æããŠããã¹ãã¬ãŒãžãåå©çšãŸãã¯è§£æŸãããŸããã
ãªãªãžãã«3.8 [basic.life] / 1 [...]ã¿ã€ãT
ãªããžã§ã¯ãã®ã©ã€ãã¿ã€ã ã¯ã次ã®å Žåã«å§ãŸããŸãã
- ã¿ã€ã
T
ã®é©åãªé
眮ãšãµã€ãºã®ã¹ãã¬ãŒãžãååŸãããŸãã - ãªããžã§ã¯ãã«éèŠãªåæåãããå Žåããã®åæåã¯å®äºããŸãã
ã¿ã€ãT
ãªããžã§ã¯ãã®ã©ã€ãã¿ã€ã ã¯ã次ã®å Žåã«çµäºããŸãã
T
ãéèªæãªãã¹ãã©ã¯ã¿ïŒ12.4ïŒãæã€ã¯ã©ã¹åã®å Žåããã¹ãã©ã¯ã¿åŒã³åºããéå§ãããŸãããŸãã¯- ãªããžã§ã¯ããå æããŠããã¹ãã¬ãŒãžã¯åå©çšãŸãã¯è§£æŸãããŸãã
ãã®ç¹å¥ãªä¿èšŒã«ãããæ°ããå€ãã¢ãœã·ãšãŒã·ã§ã³ã«å²ãåœãŠãã ãã§ã¢ãœã·ãšãŒã·ã§ã³ã®ã¢ã¯ãã£ããªã¡ã³ããŒãå€æŽã§ããã¹ãã¬ãŒãžãå¹æçã«åå©çšã§ããããã«ãªããŸããããã¯ãæåã§ã¯ãªããæšæºã®ç²Ÿç¥ã§ããŸãäžèŽããŠããŸãã
ããã«ãã¢ãœã·ãšãŒã·ã§ã³ã¯ã©ã®ã¡ã³ããŒãã¢ã¯ãã£ãã§ããããèªèããªãããããã®æ
å ±ãç¥ããã«ç¹å¥ãªã¡ã³ããŒæ©èœãå®è£
ããå¿
èŠããããŸãã ãŠããªã³ã¡ã³ãã¯åçŽãªåã«å¶éãããŠãããããã¢ã¯ãã£ããªã¡ã³ããšã¯ç¡é¢ä¿ã«ããŠããªã³ã®
åºç€ãšãªããã€ãã«é¢ããŠç¹å¥ãªã¡ã³ãé¢æ°ãå®è£
ã§ããŸãã
9.5 [class.union] / 1 [...]éèªæãªã³ã³ã¹ãã©ã¯ã¿ãŒïŒ12.1ïŒãéèªæãªã³ããŒã³ã³ã¹ãã©ã¯ã¿ãŒïŒ12.8ïŒãéèªæãªãã¹ãã©ã¯ã¿ãŒïŒ12.4ïŒããŸãã¯éèªæãªã³ããŒä»£å
¥æŒç®åïŒ 13.5.3ã12.8ïŒãæã€ã¯ã©ã¹ãªããžã§ã¯ãã¯ã¡ã³ããŒã«ãªããŸãããŠããªã³ããŸãã¯ãŠããªã³å
ã«ããé
åèŠçŽ ã [...]
ãªãªãžãã«9.5 [class.union] / 1 [...]éèªæãªã³ã³ã¹ãã©ã¯ã¿ãŒïŒ12.1ïŒãéèªæã§ãªãã³ããŒã³ã³ã¹ãã©ã¯ã¿ãŒïŒ12.8ïŒãéèªæãªãã¹ãã©ã¯ã¿ãŒïŒ12.4ïŒããŸãã¯é-èªæãªã³ããŒä»£å
¥æŒç®åïŒ13.5.3ã12.8ïŒã¯ããŠããªã³ã®ã¡ã³ããŒã«ããããšãããã®ãããªãªããžã§ã¯ãã®é
åã«ããããšãã§ããŸããã [...]
C ++ 11ã§ã¯ããã®å¶éã¯åé€ãããŸããã ãŠããªã³ã¡ã³ãã¯ãã©ã®ã¿ã€ãã§ã䜿çšã§ããŸãã éèŠãªã¡ã³ããŒãåãæ¿ããã«ã¯ãçŸåšã®ã¢ã¯ãã£ããªã¡ã³ããŒãæ瀺çã«ç Žæ£ãã
æ€çŽ¢æŒç®ånew
ã䜿çšããŠæ°ããã¢ã¯ãã£ããªã¡ã³ããŒãäœæããå¿
èŠããããŸãã
9.5 [class.union] / 4 [泚ïŒäžè¬çãªã±ãŒã¹ã§ã¯ããã¹ãã©ã¯ã¿ã®æ瀺çãªåŒã³åºãã1åããã¹ãæŒç®ånew
æ瀺çãªåŒã³åºãã1å䜿çšããŠãåæã®ã¢ã¯ãã£ããªã¡ã³ããŒãå€æŽããå¿
èŠããããŸãã -泚ã®çµãã] [äŸïŒã¿ã€ãM
ééçã¡ã³ããŒm
ããã³ã¿ã€ãN
n
æã€åæã¿ã€ãU
ãæã€ãªããžã§ã¯ãu
ãèããŸãN
M
ã«éèªæãªãã¹ãã©ã¯ã¿ãããã N
ã«éèªæãªã³ã³ã¹ãã©ã¯ã¿ãããå ŽåïŒããšãã°ããããã宣èšãŸãã¯ä»®æ³é¢æ°ãç¶æ¿ããå ŽåïŒã次ã®ãã¹ãã©ã¯ã¿ã®äœ¿çšãšnew
æŒç®åã䜿çšããŠãã¢ã¯ãã£ãã¡ã³ãu
ãm
ããn
å®å
šã«å€æŽã§ããŸãã
um~M(); new (&u.n) N;
-äŸã®çµãã]
ãªãªãžãã«9.5 [class.union] / 4 [泚ïŒäžè¬çã«ããŠããªã³ã®ã¢ã¯ãã£ããªã¡ã³ããŒãå€æŽããã«ã¯ãæ瀺çãªãã¹ãã©ã¯ã¿ãŒåŒã³åºããšæ°ããæŒç®åã®é
眮ã䜿çšããå¿
èŠããããŸãã â泚ïŒ[äŸïŒã¿ã€ãM
ééçããŒã¿ã¡ã³ããŒm
ãšã¿ã€ãN
n
ãå«ããŠããªã³ã¿ã€ãU
ãªããžã§ã¯ãu
ãèããŸãN
M
ã«éèªæãªãã¹ãã©ã¯ã¿ãããã N
ã«éèªæãªã³ã³ã¹ãã©ã¯ã¿ãããå ŽåïŒããšãã°ãä»®æ³é¢æ°ã宣èšãŸãã¯ç¶æ¿ããå ŽåïŒããã¹ãã©ã¯ã¿ãšé
眮newæŒç®åã䜿çšããŠã u
ã®ã¢ã¯ãã£ãã¡ã³ããm
ããn
å®å
šã«åãæ¿ããããšãã§ããŸã次ã®ãšããã§ãã
um~M(); new (&u.n) N;
âçµããã®äŸ]
é¢é£ä»ãã®ã¡ã³ããŒã®ããããã®ç¹å¥ãªã¡ã³ããŒé¢æ°ãèªæã§ãªãå Žåãé¢é£ä»ãèªäœã®ç¹å¥ãªã¡ã³ããŒé¢æ°ã¯ããŠãŒã¶ãŒèªèº«ã«ãã£ãŠæäŸãããªãéããæé»çã«åé€æžã¿ãšããŠå®çŸ©ãããŸãã
9.5 [class.union] / 2 [泚ïŒãŠããªã³ã®ééçã¡ã³ããŒã«éèªæãªããã©ã«ãã³ã³ã¹ãã©ã¯ã¿ãŒïŒ12.1ïŒãã³ã³ã¹ãã©ã¯ã¿ãŒã®ã³ããŒïŒ12.8ïŒãã³ã³ã¹ãã©ã¯ã¿ãŒã®ç§»åïŒ12.8ïŒãå²ãåœãŠæŒç®åã®ã³ããŒïŒ12.8ïŒãå²ãåœãŠæŒç®åã®ç§»åïŒ12.8ïŒãããå ŽåãŸãã¯ãã¹ãã©ã¯ã¿ïŒ12.4ïŒã®å Žåã察å¿ããçµåã®ã¡ã³ããŒé¢æ°ã¯ãŠãŒã¶ãŒãæäŸããå¿
èŠããããŸããããããªããšãæé»çã«çµåããåé€ãããŸãïŒ8.4.3ïŒã â泚ãçµäº]
9.5 [class.union] / 3 [äŸïŒæ¬¡ã®ãŠããªã³ãæ€èšããŸãã
union U { int i; float f; std::string s; };
std::string
typeïŒ21.3ïŒã¯ãã¹ãŠã®ç¹å¥ãªã¡ã³ããŒé¢æ°ã®éèªæãªããŒãžã§ã³ã宣èšãããããããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒãã³ããŒ/移åã³ã³ã¹ãã©ã¯ã¿ãŒãã³ããŒ/移å代å
¥æŒç®åãããã³ãã¹ãã©ã¯ã¿ãŒã¯U
åããæé»çã«åé€ãããŸãU
ã¿ã€ãU
ã䜿çšããã«ã¯ããããã®ã¡ã³ããŒé¢æ°ã®äžéšããŠãŒã¶ãŒãæäŸããå¿
èŠããããŸãã -äŸã®çµãã]
ãªãªãžãã«9.5 [class.union] / 2 [泚ïŒãŠããªã³ã®ééçããŒã¿ã¡ã³ããŒã«éèªæãªããã©ã«ãã³ã³ã¹ãã©ã¯ã¿ãŒïŒ12.1ïŒãã³ããŒã³ã³ã¹ãã©ã¯ã¿ãŒïŒ12.8ïŒãã³ã³ã¹ãã©ã¯ã¿ãŒã®ç§»åïŒ12.8ïŒãå²ãåœãŠæŒç®åã®ã³ããŒïŒ12.8ïŒãããå Žåã移å代å
¥æŒç®åïŒ12.8ïŒããŸãã¯ãã¹ãã©ã¯ã¿ãŒïŒ12.4ïŒã®å ŽåããŠããªã³ã®å¯Ÿå¿ããã¡ã³ããŒé¢æ°ã¯ãŠãŒã¶ãŒãæå®ããå¿
èŠããããŸããããããªããšããŠããªã³ã®æé»çã«åé€ãããŸãïŒ8.4.3ïŒã â泚ãçµäº]
9.5 [class.union] / 3 [äŸïŒæ¬¡ã®ãŠããªã³ãæ€èšããŸãã
union U { int i; float f; std::string s; };
std::string
ïŒ21.3ïŒã¯ãã¹ãŠã®ç¹å¥ãªã¡ã³ããŒé¢æ°ã®èªæã§ãªãããŒãžã§ã³ã宣èšããããã U
ã«ã¯æé»çã«åé€ãããããã©ã«ãã³ã³ã¹ãã©ã¯ã¿ãŒãã³ã³ã¹ãã©ã¯ã¿ãŒã®ã³ããŒ/移åã代å
¥æŒç®åã®ã³ããŒ/移åãããã³ãã¹ãã©ã¯ã¿ãŒããããŸãã U
ã䜿çšããã«ã¯ããããã®ã¡ã³ããŒé¢æ°ã®äžéšãŸãã¯ãã¹ãŠããŠãŒã¶ãŒãæäŸããå¿
èŠããããŸãã âçµããã®äŸ]
ãããã®éèªæãªã¡ã³ããŒé¢æ°ã¯ãåæã®ã¢ã¯ãã£ããªã¡ã³ããŒãæž¡ãããããã«æ¢ç¥ã§ããå Žåã«ã®ã¿-éåžžã®ã»ãã³ãã£ã¯ã¹ã«åŸã£ãŠæäŸã§ããŸãã ããŒã¯ããã
å
±çšäœã¯ã
ããèªäœã®ç¥èãæã€å
±çšäœã«é¡äŒŒããå
±çšäœãŸãã¯ã¯ã©ã¹
ã§ã ãã€ãŸããçŸåšã¢ã¯ãã£ããªã¡ã³ããŒãããã°ãããç¥ãããã®èå¥åãå«ãŸããŠããŸãã ããŒã¯ããã
ãŠããªã³ã¯ããã®èªææ§ã«é¢ä¿ãªãããã¹ãŠã®ç¹å¥ãªã¡ã³ããŒé¢æ°ãæäŸã§ããŸãã
eggs::variant<Ts...>
ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¯ã
eggs::variant<Ts...>
å
ã®ãªããžã§ã¯ãã®ã¿ã°ä»ã
çµåã§ã ã ã¢ã¯ãã£ããªã¡ã³ããŒãåãæ¿ããããã®èªç¶ãªã€ã³ã¿ãŒãã§ã€ã¹ãæäŸãããã¹ãŠã®ç¹å¥ãªã¡ã³ããŒé¢æ°ã«éåžžã®ã»ãã³ãã£ã¯ã¹ãæäŸããŸãã
eggs::variants<N, M> u;
èšèš
èšèšã®ç©¶æ¥µã®ç®æšã¯ãæ©èœãæãªãããšãªããããŒã¯ããã
ãŠããªã³ã®èšèšãäžè¬åããæ¹åããããšã§ãã ã€ãŸããã¢ãœã·ãšãŒã·ã§ã³ã®çŸåšã®ã¢ã¯ãã£ããªã¡ã³ããŒãéžæããããã®ç¹å¥ãªã¡ã³ããŒãååšããªãããã«ããããã¹ããŒã¹ãã»ãšãã©å æããªãããã«ããŸãã
struct U { union { T0 m0; ...; TN mN; }; std::size_t which; } u;
ããã«çœ®ãæããããŸãïŒ
using V = eggs::variant<T0, ..., TN>; V v;
ç¹ã«ïŒ
- ã¿ã€ã
V
ã®ãµã€ãºã¯ã察å¿ããã¿ã€ãU
ãµã€ãºãšäžèŽããå¿
èŠããããŸãU
ã¢ã¯ãã£ããªã¡ã³ããŒv
ã¯ãã¿ã€ãT0, ... TN
察å¿ããŠæŽåãããé åV
ã«é
眮ããå¿
èŠããããŸãã è¿œå ã®ã¹ãã¬ãŒãžïŒåçã¡ã¢ãªãªã©ïŒã®äœ¿çšã¯èš±å¯ãããŠããŸããã v
ã»ãã³ãã£ã¯ã¹ã¯ã u
æ確ã«å®çŸ©ãããã»ãã³ãã£ã¯ã¹ãšäžèŽãŸãã¯æ¹åããå¿
èŠããããŸãã v
ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãäŸãã°ãéã¢ã¯ãã£ããªã¡ã³ããŒu
ãžã®åç
§ãªã©ãæªå®çŸ©ã®åäœãèš±å¯ãã¹ãã§ã¯ãããŸããã- ã¿ã€ã
V
ã¯ããã¹ãŠã®ç¹å¥ãªã¡ã³ããŒé¢æ°ã«æåŸ
ãããã»ãã³ãã£ã¯ã¹ãæäŸããå¿
èŠããããŸãã
åºæ¬çã«ãã€ã³ã¿ãŒãã§ãŒã¹ã¯
ãã¡ã€ã³ã©ã€ãã©ãªã®æè¡ä»æ§ã§å®çŸ©ãããŠãã
std::experimental::optional<T>
ã«åºã¥ããŠã
ãŸã ã
optional<T>
æŠå¿µã¢ãã«ã¯ã
nullopt_t
åãš
T
åã®ã©ãã«ä»ã
ãŠããªã³ã§æ§æãããŸãã
optional<T>
ã«å¯ŸããŠè¡ãããèšèšæ±ºå®ã¯ã
variant<Ts...>
ã«ç°¡åã«è»¢éã§ããŸãããã®æŠå¿µã¢ãã«ã¯ã
nullvariant_t
åãš
Ts
èåŸã«é ãããåã®ã©ãã«ä»ããŠããªã³ã§æ§æãããŸãã ãã¹ãŠã®ç¹å¥ãªã¡ã³ããŒé¢æ°ãšé¢é£ããæŒç®åã®ã»ãã³ãã£ã¯ã¹ãããã³ã¢ã¯ãã£ããªã¡ã³ããŒãåãæ¿ããããã®ã€ã³ã¿ãŒãã§ã€ã¹ïŒæ§ç¯ãå²ãåœãŠããŸãã¯é
眮ïŒã¯ã
optional<T>
ããåçšãã
optional<T>
ã
ã¢ã¯ãã£ããªã¡ã³ããŒãžã®ã¢ã¯ã»ã¹ã¯ã
std::function
ã¹ã¿ã€ã«ã§è¡ãã
std::function
ãããã¯ãã¿ãŒã²ããã®æ£ããã¿ã€ãïŒè²§ãã人ã
ã®
dynamic_cast
ãªã©ïŒã§èŠæ±ãããå Žåãã¿ãŒã²ãããžã®ãã€ã³ã¿ãŒãè¿ããŸãã ããã«ãã¢ã¯ãã£ããªã¡ã³ããŒïŒååšããå ŽåïŒãžã®NULLãã€ã³ã¿ãŒãååŸããããšãã§ããŸããããã¯ãè£å©é¢æ°ã®å®è£
ãç°¡çŽ åããã®ã«éåžžã«åœ¹ç«ã€ããšãå€æããŸããã
æåŸã«ã
std::tuple
ãªã©ã®ãã«ããŒã¯ã©ã¹
std::tuple
æäŸãããå®è¡æã®ãã£ã¹ãã®ã»ãã³ãã£ã¯ã¹ã«è¿ãéèªæãªã»ãã³ãã£ã¯ã¹ããããŸãããã€ã³ããã¯ã¹ãŸãã¯ã¿ã€ãã«ããèŠçŽ ãžã®ã¢ã¯ã»ã¹
std::tuple
æäŸãããŸãã
åç
§ããã¥ã¡ã³ãã¯
ãã¡ãã«ãããŸã ã
å®è£
variant<Ts>
çŽæ¥å®è£
ã§ã¯ãåºç€ãšãªã
ç·©åããããŠããªã³ãã¹ãã¬ãŒãžãšããŠäœ¿çšããŸãã
template <typename ...Ts> union storage { nullvariant_t nullvariant; Ts... members; };
ãã ããäžèšã®ã³ãŒãã¯ã
C ++æ§æã®èŠ³ç¹ããã¯æ£ãããããŸããããã³ãã¬ãŒããã©ã¡ãŒã¿ã®ã»ããã¯ãã®ã³ã³ããã¹ãã§ã¯å±éã§ããªãããã§ããåç
§ã§ããããã«ã¡ã³ããŒåãå«ããå¿
èŠããããŸãã 代ããã«ãååž°çãªã¢ãããŒãã䜿çšããŠãåºç€ãšãªãã¹ãã¬ãŒãžãæ§ç¯ããŸãã
template <typename ...Ts> union storage; template <typename T, typename ...Ts> union storage<T, Ts...> { nullvariant_t nullvariant; T head; storage<Ts...> tail; }; template <> union storage<> { nullvariant_t nullvariant; };
æ®å¿µãªãããããã¯
Ts
åã®éèŠãªç¹æ®ã¡ã³ããŒé¢æ°ãçµæãšããŠãªããžããªãã察å¿ããç¹æ®ã¡ã³ããŒé¢æ°ãåé€ããããšãèãããšãããã»ã©åçŽã§ã¯ãããŸããã ãã®å®è£
ã䜿çšããã«ã¯ãå°ãªããšãããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãšãã¹ãã©ã¯ã¿ãçµæã®ãªã¹ãã«å®è£
ããå¿
èŠããããŸããããã¹ãã©ã¯ã¿ã¯æçšãªããšã¯äœãã§ããŸããã
ç·©åãããé¢é£ä»ãã
C ++ã«ç»å Žããåã«äœ¿çšãããæãåçŽãªå®è£
ã¯ã
Ts
ä»»æã®åã®æ ŒçŽã«é©ãã
ãã¢ã¹ãã¬ãŒãžã䜿çšããŸã-泚æãã¹ãã€ã©ãŒïŒå Žåã«ãã£ãŠã¯ãåäœããŸããã æšæºã«ã¯ãäœæ¥ã容æã«ããç¹å¥ãª
ããããã£ãçšæãããŠããŸãã
10.20.7.6 [meta.trans.other]
template <std::size_t Len, class... Types> struct aligned_union;
- æ¡ä»¶ïŒå°ãªããšã1ã€ã®ã¿ã€ããæå®ããå¿
èŠããããŸãã
- ã³ã¡ã³ãïŒã¡ã³ããŒã¿ã€ãããšã®typedefã¯PODã¿ã€ãã§ããå¿
èŠãããã
Types
ãªã¹ãã«ãªã¹ããããŠãããªããžã§ã¯ãã®åæåãããŠããªãã¹ãã¬ãŒãžãšããŠäœ¿çšã§ããã ãã®ãµã€ãºã¯å°ãªããšãLen
ã§ãªããã°ãªããŸããã éçã¡ã³ããŒalignment_value
ã¯ã std::size_t
åã®æŽæ°å®æ°ã§ããå¿
èŠãããããã®å€ã¯ã Types
ãªã¹ãã«ãªã¹ããããŠãããã¹ãŠã®åã®æãå³å¯ãªé
眮ãå®çŸ©ããŸãã
ãªãªãžãã«10.20.7.6 [meta.trans.other]
template <std::size_t Len, class... Types> struct aligned_union;
- æ¡ä»¶ïŒå°ãªããšã1ã€ã®ã¿ã€ããæäŸãããŸãã
- ã³ã¡ã³ãïŒã¡ã³ããŒtypedefã¿ã€ãã¯ãã¿ã€ãã
Types
ãªã¹ããããŠãããªããžã§ã¯ãã®åæåãããŠããªãã¹ãã¬ãŒãžãšããŠã®äœ¿çšã«é©ããPODã¿ã€ãã§ãªããã°ãªããŸããã ãã®ãµã€ãºã¯å°ãªããšãLen
ã§ãªããã°ãªããŸããã éçã¡ã³ããŒalignment_value
ã¯ã std::size_t
åã®æŽæ°å®æ°ã§ããããã®å€ã¯Types
ãªã¹ããããŠãããã¹ãŠã®åã®äžã§æãå³å¯ãªã¢ã©ã€ã¡ã³ãã§ãã
ãã®ããããã£ã¯ãç·©åãããã¢ãœã·ãšãŒã·ã§ã³ã®åºçŸãšãšãã«ã
äœæ¥ãã©ããããæ¢ã«åé€ãããŠãããçŸåšã§ã¯é³è
åã®æœåšçãªåè£ã§ããããšã«æ³šæããå¿
èŠããããŸãã
C ++ 14ã§å¯èœãªä»£æ¿ã¯æ¬¡ã®ãšããã§ãã
template <std::size_t Len, typename ...Types> struct aligned_union { static constexpr std::size_t alignment_value = std::max({alignof(Types)...}); struct type { alignas(alignment_value) unsigned char _[std::max({Len, sizeof(Types)...})]; }; };
èšæ¶åã®åãšããŠ
aligned_union
ã䜿çšãããšã
variant<Ts>
ç°¡æããŒãžã§ã³ã次ã®ããã«å®è£
ã§ããŸãã
template <typename ...Ts> class variant { template <typename T> struct _index_of { };
ç¹å¥ãªã¡ã³ããŒé¢æ°ã¯ãã¢ã¯ãã£ããªã¡ã³ããŒïŒååšããå ŽåïŒã«ãªãã€ã¬ã¯ãããå¿
èŠããããŸãã ç¹°ãè¿ãã«ãªããŸããããã®ç®æšãéæããããã«
switch
ã䜿çšããããšã¯ã§ããŸãã-ãããè¡ãããšãã§ããã°ãããã¯ã¯ããã«ç°¡åã§ã¯ãããŸããã-å³æ眮æã«ã¯ååž°çãªå®è£
ããããŸãïŒ
struct _destructor { template <typename T> static void call(void* ptr) { static_cast<T*>(ptr)->~T(); } }; variant<Ts...>::~variant() { apply<_destructor, Ts...>(_which, &_storage); } template <typename F> void apply(std::size_t , void* ) {} template <typename F, typename T, typename ...Ts> void apply(std::size_t which, void* storage) { if (which == 0) { F::template call<T>(storage); } else { apply<F, Ts...>(which - 1, storage); } }
apply
ã¡ãœããã®éååž°çãªå®è£
ã¯ã
switch
ãè¡ãæ¹æ³ãšåæ§ã«ããžã£ã³ãããŒãã«ã䜿çšããŠæ§ç¯ã§ãããã®åŸã«é©åãªãšã³ããªãžã®é·ç§»ãç¶ããŸãã
template <typename F, typename ...Ts> void apply(std::size_t which, void* storage) { using fun_ptr = void(*)(void*); static constexpr fun_ptr table[] = {&F::template call<Ts>...}; if (which < sizeof...(Ts)) { table[which](storage); } }
éååž°çå®è£
ã¯ãçæãããã³ãŒããé«éåããã ãã§ãªãã
Ts
ãªã¹ãã«å€æ°ã®åãããå Žåã«ã³ã³ãã€ã«ã倧å¹
ã«é«éåããŸã-ããªãã®å Žåãæšå®å€ã¯å€ããå¯èœæ§ããããŸãã
ç°¡åã«ã³ããŒãããã¿ã€ã
ç°¡åã«ã³ããŒãããã¿ã€ããšã¯ããã®æ§æããããã³ããŒããããšã§ãã€ãŸã
std::memcpy
ã䜿çšããŠã³ããŒã§ããã¿ã€ãã§ãã
3.9 [basic.types] / 2ç°¡åã«ã³ããŒãããåT
ãªããžã§ã¯ãïŒåºæ¬ã¯ã©ã¹ã®ãµããªããžã§ã¯ããé€ãïŒã«å¯ŸããŠãåT
æå¹ãªå€ãå«ãŸããŠãããã©ããã«ãããããããã®æ§æãã€ãïŒ1.7ïŒãchar
ãŸãã¯unsigned char
é
åã«ã³ããŒã§ããŸãã char
ãŸãã¯unsigned char
é
åã®å
容ããªããžã§ã¯ãã«ã³ããŒãããå ŽåãçµæãšããŠãªããžã§ã¯ãã¯å
ã®å€ãååŸããã¯ãã§ãã [...]
3.9 [basic.types] / 3 T
2ã€ã®ãã€ã³ã¿ãŒobj2
ã¿ã€ãT
ç°ãªããªããžã§ã¯ãobj1
ããã³obj2
æãå Žåãä»»æã®ç°¡åã«ã³ããŒãããã¿ã€ãT
ã«ã€ããŠã obj1
ãŸãã¯obj2
ãããããåºæ¬ã¯ã©ã¹ã®ãµããªããžã§ã¯ãã§ããã obj2
ãã€ãïŒ1.7ïŒãobj2
ã³ããŒãããŸããçµæãšããŠã obj2
ã¯obj1
ãšåãå€ãå«ãŸããŠããå¿
èŠããããŸãã [...]
ãªãªãžãã«3.9 [basic.types] / 2ç°¡åã«ã³ããŒå¯èœãªåT
ãªããžã§ã¯ãïŒããŒã¹ã¯ã©ã¹ãµããªããžã§ã¯ã以å€ïŒã®å Žåããªããžã§ã¯ããåT
æå¹ãªå€ãä¿æããŠãããã©ããã«ãããããããªããžã§ã¯ããæ§æããåºæ¬ãã€ãïŒ1.7ïŒ char
ãŸãã¯unsigned char
é
åã«ã³ããŒãããŸãã char
ãŸãã¯unsigned char
é
åã®å
容ããªããžã§ã¯ãã«ã³ããŒãããå Žåããªããžã§ã¯ãã¯å
ã®å€ãä¿æããŸãã [...]
3.9 [basic.types] / 3 T
ãžã®2ã€ã®ãã€ã³ã¿ãŒãå¥åã®T
ãªããžã§ã¯ãobj1
ãšobj2
ãæããŠããå Žåãä»»æã®ç°¡åã«ã³ããŒå¯èœãªåT
ã«å¯ŸããŠã obj1
ãobj2
ãããŒã¹ã¯ã©ã¹ã®ãµããªããžã§ã¯ãã§ã¯ãªããåºç€ãšãªããã€ãïŒ1.7ïŒ obj1
ã¯obj2
ã«ã³ããŒããããã®åŸã obj2
ã¯obj1
ãšåãå€ãä¿æããŸãã [...]
ç°¡åã«ã³ããŒãããã¡ã³ããŒã®åéåèªäœã¯ç°¡åã«ã³ããŒãããè¿œå ã®æé©åã®åè£ã«å
¥ããããŸããããã¯ãç°¡åã«ã³ããŒãããã¿ã€ãã§ã¯å®è¡ã§ããŸããã ç°¡åã«ã³ããŒãããåãæã€
variant
ãç°¡åã«ã³ããŒãããåŸåãããã¯ãã§ãã
9 [ã¯ã©ã¹] / 6ç°¡åã«ã³ããŒãããã¯ã©ã¹ã¯ã次ã®ã¯ã©ã¹ã§ãïŒ
- èªæã§ãªãã³ããŒã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãããŸããïŒ12.8ïŒã
- éèªæãªå€äœã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãããŸããïŒ12.8ïŒã
- èªæã§ãªãã³ããŒå²ãåœãŠæŒç®åïŒ13.5.3ã12.8ïŒã
- èªæãªç§»å代å
¥æŒç®åïŒ13.5.3ã12.8ïŒããªãã
- äºçŽ°ãªãã¹ãã©ã¯ã¿ïŒ12.4ïŒããããŸãã
[...]
ãªãªãžãã«9 [ã¯ã©ã¹] / 6ç°¡åã«ã³ããŒå¯èœãªã¯ã©ã¹ã¯ã次ã®ã¯ã©ã¹ã§ãïŒ
- èªæã§ãªãã³ããŒã³ã³ã¹ãã©ã¯ã¿ã¯ãããŸããïŒ12.8ïŒã
- éèªæãªç§»åã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãããŸããïŒ12.8ïŒã
- èªæã§ãªãã³ããŒå²ãåœãŠæŒç®åã¯ãããŸããïŒ13.5.3ã12.8ïŒã
- èªæã§ãªã移åå²ãåœãŠæŒç®åã¯ãããŸããïŒ13.5.3ã12.8ïŒã
- äºçŽ°ãªãã¹ãã©ã¯ã¿ïŒ12.4ïŒããããŸãã
[...]
ãããå®çŸããã«ã¯ãTã®ãã¹ãŠã®ã¿ã€ããç°¡åã«ã³ããŒãããå Žåãå¥ã®
variant
ç¹æ®åãéžæããå¿
èŠããããŸãã äžèšã®ç¹å¥ãªã¡ã³ããŒé¢æ°ã¯ããã®ç¹æ®åã®ããã«ãŠãŒã¶ãŒã«ãã£ãŠæäŸãããã¹ãã§ã¯ãããŸãã-ãããã¯ãããã©ã«ãã§çæãããããã«ãããããæåã«å®çŸ©ããããšãã«æé»çãŸãã¯æ瀺çã«æå®ãããã¹ãã§ãã å®è£
ã¯ãç°¡åãªæé»ã®å®çŸ©ãæäŸããŸãã ã³ããŒããã³ç§»åæŒç®åã¯ãããããå«ãã¹ãã¬ãŒãžãããããã£ã¹ã¯ãªãããŒã¿ãŒãšäžç·ã«åã«ã³ããŒããŸããããã¹ãã©ã¯ã¿ã¯äœãããŸããã
ãã ãã1ã€åé¡ããããŸããç°¡åã«ã³ããŒãããã¯ã©ã¹ã¯ãŸã£ããã³ããŒã§ããªãå ŽåããããŸãããæåã«å®çŸ©ããããšãã«åé€ãããç¹å¥ãªã¡ã³ããŒé¢æ°ã¯ç°¡åã§ãã ããšãã°ã
boost::noncopyable
ã¯ã©ã¹ã®å®çŸ©æ¹æ³ãèŠãŠãã ããã
class noncopyable { protected: constexpr noncopyable() = default; noncopyable(noncopyable const&) = delete; noncopyable& operator=(noncopyable const&) = delete; ~noncopyable() = default; };
std::is_trivially_copyable
ã
noncopyable
ã¯ã©ã¹ã«å¯ŸããŠ
true
ãåºåããã®ã¯é©ãã§ãã ããã«å€§ããªé©ãã¯ãã³ããŒã§ããªããªã¢ãŒãã¡ã³ãé¢æ°ããŸã£ãã䜿çšãããŠããªãããã
variant<noncopyable>
ã€ã³ã¹ã¿ã³ã¹ãæ£åžžã«ã³ããŒã§ããããšã§ãã å®éãããã¯åã»ãã¥ãªãã£éåã¯ãåæå®ãããŠããªããã¢ã¹ãã¬ãŒãžã䜿çšããŠã¢ã¯ãã£ããªã¡ã³ããŒãæ ŒçŽãããšãã決å®ã«èµ·å ããŸãã
ç°¡åã«ç Žå£å¯èœãªå
åã®ãã1ã€ã®éèŠãªã«ããŽãªã¯ã
ç°¡åã«ç Žå£å¯èœ
ãªåã§ãã
12.4 [class.dtor] / 5 [...]ãã¹ãã©ã¯ã¿ã¯ããŠãŒã¶ãŒããæäŸãããªãå Žåãããã³æ¬¡ã®å Žåã«ç°¡åã§ãã
- ããã¯ä»®æ³ã§ã¯ãªãã
- ç¹å®ã®ã¯ã©ã¹ã®ãã¹ãŠã®çŽæ¥ã®åºåºã¯ã©ã¹ã«ã¯ãç°¡åãªãã¹ãã©ã¯ã¿ãããã
- åã®ã¯ã©ã¹ïŒãŸãã¯ã¯ã©ã¹ã®é
åïŒãæã€ãã®ã¯ã©ã¹ã®ãã¹ãŠã®ééçã¡ã³ããŒã®å Žåããã®ãããªåã¯ã©ã¹ã«ã¯ç°¡åãªãã¹ãã©ã¯ã¿ããããŸãã
ãã以å€ã®å Žåããã¹ãã©ã¯ã¿ã¯éèŠã§ãã
ãªãªãžãã«12.4 [class.dtor] / 5 [...]ãã¹ãã©ã¯ã¿ã¯ããŠãŒã¶ãŒãæäŸããŠããªãå Žåãããã³æ¬¡ã®å Žåã«ç°¡åã§ãã
- ãã¹ãã©ã¯ã¿ã¯ä»®æ³ã§ã¯ãªãã
- ãã®ã¯ã©ã¹ã®ãã¹ãŠã®çŽæ¥åºåºã¯ã©ã¹ã«ã¯ç°¡åãªãã¹ãã©ã¯ã¿ãããã
- ã¯ã©ã¹åïŒãŸãã¯ãã®é
åïŒã§ãããã®ã¯ã©ã¹ã®ãã¹ãŠã®ééçããŒã¿ã¡ã³ãã«ã€ããŠããã®ãããªåã¯ã©ã¹ã«ã¯ç°¡åãªãã¹ãã©ã¯ã¿ããããŸãã
ãã以å€ã®å Žåããã¹ãã©ã¯ã¿ã¯éèŠã§ãã
constexpr
åŒã®ã³ã³ããã¹ãã§ã€ã³ã¹ã¿ã³ã¹ã䜿çšã§ãã
ãªãã©ã«åã®èŠä»¶ã®1ã€ã¯ããã®åçŽãªç Žå£æ§ã§ãããããããã¯ç¹ã«éèŠã§ãã
3.9 [basic.types] / 10次ã®å Žåãåã¯ãªãã©ã«åã§ãã
ãªãªãžãã«3.9 [basic.types] / 10次ã®å Žåãåã¯ãªãã©ã«åã§ãã
- [...]
- 次ã®ãã¹ãŠã®ããããã£ãæã€ã¯ã©ã¹åïŒ9é
ïŒïŒ
- åãã«è¶³ããªããã¹ãã©ã¯ã¿ãããã
- éçŽåïŒ8.5.1ïŒã§ããããå°ãªããšã1ã€ã®constexprã³ã³ã¹ãã©ã¯ã¿ãŒãŸãã¯ã³ããŒãŸãã¯ç§»åã³ã³ã¹ãã©ã¯ã¿ãŒã§ã¯ãªãã³ã³ã¹ãã©ã¯ã¿ãŒãã³ãã¬ãŒãããããŸãã
- ãã¹ãŠã®ééçããŒã¿ã¡ã³ããŒãšåºæ¬ã¯ã©ã¹ã¯ãäžæ®çºæ§ãªãã©ã«ã¿ã€ãã§ãã
å°ãªããšã1ã€ã®ã¡ã³ããŒããªãã©ã«åã§ãããæ®ãã®ã¡ã³ããŒãç°¡åã«ç Žå£ã§ããå ŽåããŠããªã³ã¯ãªãã©ã«åã«ããããšãã§ããŸãããããã£ãŠvariant
ããããã®æ¡ä»¶äžã§ã¯ããªãã©ã«åã«ãªãããã«åªåããå¿
èŠããããŸããvariant
ãã¹ãŠã®ã¿ã€ãTs
ãèªæã«ç Žå£å¯èœã§ããå Žåã¯ãå¥ã®å°éåéãéžæããå¿
èŠããããŸãããã ããå®æ°åŒã®å¶éã«ã¯void
ããªããžã§ã¯ããžã®ãã€ã³ã¿ãžã®ãã€ã³ã¿ã®ãã£ã¹ãã«é¢ããå¶éããããããããŸãæçšã§ã¯ãããŸããã5.19 [expr.const] / 2次ã®åŒã®ããããã§æœè±¡ãã·ã³ïŒ1.9ïŒã®ã«ãŒã«ã«åŸã£ãe
èšç®e
ãèšç®ã§ããªãå Žåã«ã®ã¿ãæ¡ä»¶åŒã¯å®æ°åŒã®ã³ã¢ã«ãªããŸãã
- [...]
cv void*
ãªããžã§ã¯ããžã®ãã€ã³ã¿ãŒã®åããåãžã®å€æã- [...]
ãªãªãžãã«5.19 [expr.const]/2 A conditional-expression e
is a core constant expression unless the evaluation of e
, following the rules of the abstract machine (1.9), would evaluate one of the following expressions:
- [...]
- a conversion from type
cv void*
to a pointer-to-object type; - [...]
ãŸããåãªãã®rawã¹ãã¬ãŒãžã䜿çšãããšãã決å®ã«ãããæ±çšã©ãã«ä»ãããŒã«ã®å®è£
ã®å®å
šæ§ã¯ãæåã§å®è£
ããããšã§éæã§ããã¬ãã«ãšåãã¬ãã«ã«å¶éãããŸãããŸã èšãããŠããªãããš
çã®ã¹ãã¬ãŒãžã«åºã¥ããå®è£
ã¯ããã®äŸ¡æ Œãæ£åœåããŸãããæ°Žãä¿æããŸããããéåžžã®ãã¬ãŒã ã¯ãŒã¯ãè¶
ãã䟡å€ããããŸããäžè¬åãããã¿ã€ãã»ãŒãã®ããŒã¯ã¢ããããããŠããªã³ã§ã®å€ã®ä¿åã¯ãéåžžã®ãŠããªã³ã§ãªããã°ãªããŸãããããã§ãªãå Žåããã¹ãŠã®æ©èœã䜿çšããŠãæ©èœããŸããã