åœåãããDã¯èªèº«ãC ++ã®æ¹è¯çãšããŠäœçœ®ä»ããŠããŸãïŒå°ãªããšãããã®èšäºãèªãã å ŽåïŒã ããã€ãã®å€ãæ§æãç Žæ£ããåŸæ¥ã®C ++ã§å®è£ ã§ããªãã£ãæ°ãããã®ãå°å ¥ããåæã«çµã¿èŸŒã¿ã¢ã»ã³ãã©ããã€ã³ã¿ãŒãCã©ã€ãã©ãªã®äœ¿çšãªã©ã®äœã¬ãã«ã®æ©èœãæ éã«ä¿æããæ©èœã«ãããDã¯ã·ãªãŒãºCã®æ¬¡ã®ã¿ã€ãã«ã®ãŠããŒã¯ãªåè£ã«ãªããŸã-C ++-...ãã ãŸããããã¯ç§ã®èŠ³ç¹ããã§ããç§èªèº«ïŒäžå¯§ã«ãæ®å¿µãªãããè¿œå ããã®ã¯è¯ãããšã§ãïŒã¯å®å šã«åäžèšèªã§ãããç§ã¯é·å¹ŽC ++ã§æžããŠããŠãä»ã®èšèªã«ç²Ÿéããè©Šã¿ã¯å¿ ç¶çã«è¯ã倢ã«çµãããŸããã ããããä»ã®ä¿¡ä»°ã®ä»£è¡šè ããã¯ãèšèªãšããŠDã圌ãã«ãšã£ãŠèå³æ·±ããšèããã®ã§ããã¢ãŒã«åå ããå šå¡ãæåŸ ããŸãã
äœãèŠããŸããïŒ ããã€ãã®éåžžã«è¯ãæ¬ããã§ã«Dã«æžãããŠããã®ã§ãæšæºã©ã€ãã©ãªããgetoptïŒïŒé¢æ°ãåãåºããŠãã®ã³ãŒããèŠãããšã«ããŸãããããã¯ãæ¬ã§èªãã ãã®ã埩掻ãããéåžžã«æçãªç·Žç¿ã§ãã ãªããŸãã«ãã®æ©èœãªã®ã§ããããïŒ ãŸãã圌女ã¯èª°ã«ã§ã銎æã¿ããããäœç³»çã«ç¬ç«ããŠããŸããç§ã¯å人çã«é±ã«3ã4å䜿çšãã3ã€ã®ç°ãªãèšèªã§ã©ã®ããã«æžãããã詳现ã«æ³åããŠããŸãã ããã«ãã³ãŒãã®äœæè ã¯Alexandrescuã§ããæ¬ã§åœŒã®ã³ãŒãã®ãã¬ãŒãã³ã°äŸãäœåºŠãèŠãŠããŸãããæ¬çªç°å¢ã§æžãããã³ãŒããèŠãããšã¯ãããŸããããèå³æ·±ãã§ãã çµå±ãç§ã¯ç¢ºãã«æµæããããšãã§ãããèªè»¢è»ãæžããŸããïŒèªç¶ã«æ¹åãããŸããïŒããã®å Žåãããã¯å®å šã«é©åã§ãããä»ã®äººã®ã³ãŒãã解æãããããæçšã§ãã
ç§ãã¡ã¯èŠã䟡å€ã®ãããã®ãã¹ãŠããé ãé¢ããŠèŠããã§ãããããããŠç§èªèº«ã¯å°é家ããã¯ã»ã©é ãã®ã§ãæ°ã«ããããªãèªèº«ã®ããã«èªãã§ãã ããããªã³ã¯ã¯æåŸã«ãããŸãã
å±å€æ€æ»
é¢æ°ã®äœ¿çšæ¹æ³ã瀺ãã³ãŒãã次ã«ç€ºããŸããvoid main(string[] args) { // placeholders string file; bool quiet; enum Count { zero, one, two, three }; Count count; int selector; int[] list; string[string] dict; std.getopt.arraySep=","; auto help=getopt(args, , std.getopt.config.bundling , "q|quiet", "opposite of verbose", &quiet , "v|verbose", delegate{quiet=false;} , "o|output", &file , "on", delegate{selector=1;} , "off", delegate{selector=-1;} , std.getopt.config.required, "c|count", "counter", &count , "list", &list , "map", &dict ); if(help.helpWanted) defaultGetoptPrinter("Options:", help.options); }
æåã«è¡šç€ºãããã®ã¯ãã»ãŒCãã§ãã次ã«ãåçé å-string []ããã³int []ãããã³é£æ³é å-string [string]ã®ååšã«æ°ä»ããŸãã 次ã«ãããã€ãã®çãããå²ãåœãŠ-std.getopt.arraySep = "ã" ãããã¯æ¬åœã«ã°ããŒãã«å€æ°ã§ãïŒïŒãç§ãã¡ã¯kunstkameraã«æ¥ãŸãããããããšãã©ãã§ããïŒ ãã®åçãªé£æ³é åã¯ãã¹ãŠãã®èšèªã«ååšãããã®åºç€ã®1ã€ãæ§æããŠããŸãïŒç§ã¯å人çã«ã¯ãPerlãèšèã®æå³ã§ããã«æãåºããŸãïŒã ãã ãã std.getopt.arraySepã¯ã¢ãžã¥ãŒã«ã«å±ããçã®ã°ããŒãã«å€æ°ã§ããã getoptïŒïŒãªã©ã®ç¹å®ã®é¢æ°ã§ãã£ãŠããçŽç²äž»çŸ©è ã®èŠ³ç¹ããã¯ãããããããå²ãåœãŠãããšã¯æãããããšã§ãã ãã ããããã§ã¯ãã¹ãŠãæ確ã§ã¯ãªãããã arraySep ã¯é¢æ°ã®ãã¢ãšããŠå®çŸ©ã§ããŸãã
@property string arraySep() { return ... } @property void arraySep(string separator) { .... }
æãå³æ ŒãªããŒã¿ã«ãã»ã«åæšæºãæºãããªãããå€æ°ã®ããã«èŠããŸã ã ããã¯äžçš®ã®ãã©ã³ãåããããããDã§ã-æ§æç³ãå®ç§ã«ãªããèšèªã®ãŠããŒã¯ãªå€èŠ³ã圢æããŸãã ããã«ããã®åŒã³åºãã¯æ¬¡ã®ããã«ãªããŸã ",".arraySep;
ã¯ããã«ãã§ãããããåé¯ã®ããã§ããïŒ ãã®ãã¶ã€ã³ã¯ã©ãã§ããïŒ
auto helloWorld="dlrowolleh".reverse.capitalize_at(0).capitalize_at(5).insert_at(5,' ');
ããã¯åœç¶ãææ©çãªäŸã§ããããã®ãããªæ§æãçã«ããªã£ãŠããããšã瀺ããŠããŸããããã®æ§é ã¯Dã§åºã䜿çšãããŠãããbashã¹ã¯ãªããã®ãã€ã ïŒ|èšå·ïŒãšåãæåãåããŠããŸãã çŸããååïŒ Uniform Function Call SyntaxããããŸãããå®éã«ã¯a.funïŒbãcïŒã®ããã«funïŒaãbãcïŒãåŒã³åºãããšãã§ããã®ã¯æ§æç³ã«ãããŸããã
次ã«ãå®éã®é¢æ°åŒã³åºããšã€ã³ã¿ãŒãã§ã€ã¹ã®ä¿¡ããããªãã»ã©ã®æè»æ§ãããã«ç®ãåŒããŸããä»»æã®ãã³ãã©ãŒãšèª¬æãå«ãä»»æã®æ°ã®æ§æãã©ã¡ãŒã¿ãŒãé¢æ°ã«çŽæ¥æž¡ãããŸãã Dãæå³ããã«åçåä»ããè¡ãèšèªã§ãããšããçããæœãã§ããŸãã åŸã§èŠãããã«ããã®çš®ã®ãã®ã¯å®ç§ãªãã³ãã¬ãŒãæè¡ã§ã¯ãããŸããã
äžè¬çã«ããªãã·ã§ã³ã®èª¬æã¯æ¬¡ã®è¡ã§äžããããŸãã
[修食åã]ãªãã·ã§ã³ãªãã·ã§ã³ã[説æã]ããã³ãã³ãã©ãŒ
ããã§æãäºçŽ°ãªéšåã¯ãªãã·ã§ã³ã§ããããf | foo | x | something-elseããšãã圢åŒã®åãªãè¡ã§ãããçãå矩èªãšé·ãå矩èªã®äž¡æ¹ãå®çŸ©ããŸãã 説æïŒæ§æã®ãã«ãè¡ïŒãåãªãè¡ã§ãããããå¿ èŠãããŸãããããã«ã¯ãã³ã³ãã€ã«æ®µéã§ã®åã®äœæ¥ãæ¢ã«å«ãŸããŠããŸãã
å®éã®éæ³ã¯ãã³ãã©ãŒããå§ãŸããŸããã¢ãã¬ã¹ã§ããå¿ èŠããããŸããã enum ïŒãã®å Žæã§ã¯ãç§ã®å éšC ++ããã¯ããŒã ã¯ç§ã®é¡ã«ãããå¯ã£ãŠããŸãïŒãå«ãã»ãšãã©ãã¹ãŠã®ã¢ãã¬ã¹ãããã³é¢æ°ãŸãã¯ã©ã ãé¢æ°ã®ã¢ãã¬ã¹ïŒãŸããããã¯åçŽã§ããïŒïŒ
詳现ïŒ
- boolãžã®ãã€ã³ã¿ãŒããã³ãã©ãŒãšããŠæå®ãããŠããå Žåããªãã·ã§ã³ã¯åŒæ°ãªãã§æ瀺ããã-fãŸãã¯--fooã¯å€æ°ã«trueãæžã蟌ã¿ãŸãã ãã ãããããè¡ãããšãã§ããŸãïŒ--foo trueãŸãã¯--foo = falseã
- ãã³ãã©ãæååãæ°å€åããŸãã¯enumãžã®ãã€ã³ã¿ã§ããå ŽåãåŒæ°ä»ãã®ãªãã·ã§ã³ãæåŸ ãããŸããããã¯ãç®çã®åã«å€æããããã€ã³ã¿ã«å²ãåœãŠãããŸãã
- ãã1ã€ã®ãªãã·ã§ã³ããã³ãã©ãŒãæŽæ°åãžã®ãã€ã³ã¿ãŒã§ããããªãã·ã§ã³ãã+ãã§çµããå Žåããªãã·ã§ã³ãã³ãã³ãã©ã€ã³ã«è¡šç€ºããããã³ã«ãã³ãã©ãŒãå¢åãããŸãã
- ãã³ãã©ãŒãé åãžã®ãã€ã³ã¿ãŒã§ããå Žåãããã¯ãç®çã®åã«å€æãããŠé åã«è¿œå ãããåŒæ°ãæã€ãªãã·ã§ã³ãæå³ããŸã;è€æ°ã®å€ãã³ã³ãã§åºåã£ãŠæå®ããããšãã§ããŸãã ã³ãã³ãã©ã€ã³--foo = 1,2,3,4,5ã解æããåŸã察å¿ããé åã¯[1,2,3,4,5]ã«ãªããŸãã
- åæ§ã«ãé£æ³é åãžã®ãã€ã³ã¿ãŒãæž¡ãããšãã§ããŸãããã©ã¡ãŒã¿ãŒãšããŠãå¿ èŠãªåã«å€æããã<key> = <value>ãã¢ã®ãªã¹ããæž¡ãå¿ èŠããããŸãã
ãã®é¢æ°ã¯ã2ã€ã®èŠçŽ ã®ã¿ãã«ãè¿ããŸã-å°å·å¯èœãªãªãã·ã§ã³ã®ãªã¹ããããã³è«çå€æ°helpWantedã-hãŸãã¯--helpãªãã·ã§ã³ãã³ãã³ãã©ã€ã³ã«ååšããå Žåã¯trueïŒãªã¹ãã«èªåçã«è¿œå ãããŸãïŒã
ããŠãå³ãå®æãããããã«ãåãªãã·ã§ã³ã«ã¯ãäŸãã°requiredãŸãã¯caseInsensitiveã®ãã ãªä¿®é£ŸåããããŸãã ããã«ãã¢ãžã¥ãŒã«ã¯ãoptionChar = '-'ãendOfOptions = "-"ãarraySep = "ã"ãªã©ã®ããã€ãã®ã°ããŒãã«å€æ°ãå®çŸ©ããŸãããããã®å²ãåœãŠã«ãããã³ãã³ãã©ã€ã³æ§æãå€æŽãããŸãã
ãã®çµæãæ®éçã§äŸ¿å©ãªé¢æ°ãåŸãããŸããããã¯ãã³ãã¬ãŒãã§ãããC ++ã§åæ§ã®ãã®ãå®è£ ããæ¹æ³ã¯ã»ãŒæããã§ãããDã§ã©ã®ããã«å®è¡ãããã®ã§ããããã
ããŒããéããŸã
æåã«æ³šæãåŒãã®ã¯ããã³ãã¬ãŒãé¢æ°ãå®çŸ©ããéåžžã«ã·ã³ãã«ã§èªç¶ãªæ¹æ³ã§ããéåžžé¢æ°ãšãã³ãã¬ãŒãé¢æ°ã®æ§æã®éãã¯ãç¥èŠãå€ããã»ã©åŸ®åŠã§ãããéåžžãé¢æ°ãšããã³ãã¬ãŒããé¢æ°ã§ã¯ãªãããã³ãã¬ãŒãã«ãªããŸãã ä»åŸã optsåŒæ°ã«ã¯é åãšããŠã¢ã¯ã»ã¹ã§ããŸã-opts [0]ãopts [$-1]ãŸãã¯opts [2..5]; GetoptResult getopt(T...)(ref string[] args, T opts) { ... getoptImpl(args, cfg, rslt, opts); return rslt; }
å®éããããã¬ãã«ã®é¢æ°ã«ã€ããŠã¯ãå¶åŸ¡ãããã«getoptImplïŒïŒã«è»¢éããããããã以äžèª¬æããããšã¯ãããŸããã
1 private void getoptImpl(T...)(ref string[] args, ref configuration cfg, ref GetoptResult rslt, T opts) 2 { 5 static if(opts.length) { 6 static if(is(typeof(opts[0]) : config)) { 7 // it's a configuration flag, act on it 8 setConfig(cfg, opts[0]); 9 return getoptImpl(args, cfg, rslt, opts[1 .. $]); 10 } else { 11 // it's an option string ... 16 static if(is(typeof(opts[1]) : string)) { 17 auto receiver=opts[2]; 18 optionHelp.help=opts[1]; 19 immutable lowSliceIdx=3; 20 } else { 21 auto receiver=opts[1]; 22 immutable lowSliceIdx=2; 23 } ... 34 bool optWasHandled=handleOption(option, receiver, args, cfg, incremental); 41 return getoptImpl(args, cfg, rslt, opts[lowSliceIdx .. $]); 42 } 43 } else { 44 // no more options to look for, potentially some arguments left ... 68 } 75 } 76 }
æ°åã§ãããããã«ãç§ã¯ããªãã®æ°ã®è¡ãæšãŠãŸãããããã®ã³ãŒãã®æ§é å šäœãå®å šã«èŠããŠããŸããã
æåã«æ³šæãåŒãã®ã¯ã éçifïŒïŒ{} else static ifïŒïŒ{} else {}ã®æ§ç¯ã§ããã¯ããããã¯ãŸãã«ããªããèããŠãããã®ã§ãã ã³ã³ãã€ã«æã«éçifåŒãéžæããããã©ã³ãã¯ãåœç¶ã ã³ã³ãã€ã«æã«æ¡ä»¶ãèªèãããŠããå¿ èŠããããŸãã ãããã£ãŠãã³ã³ãã€ã«äžã®ãã®ã³ãŒãïŒç§ã®å¥œã¿ã«åãããŠã¹ãã²ããã£ãå°ãé ãïŒã¯ããã®ç¹å®ã®é¢æ°åŒæ°ã»ããã«æå³ã®ããããã€ãã®è¡ã«ã«ãããããŸãã ãã§ã«è¿°ã¹ãããã«ããã³ãã¬ãŒããã©ã¡ãŒã¿ãŒã¯äžå€é åã®ããã«æ±ãããšãã§ããŸãããªãã·ã§ã³ã®ãªã¹ãã空ã®å Žåã ïŒopts.lengthïŒã0ãè¿ãå Žåã¯éçãªã®ã§ã43è¡ç®ã®ã³ãŒãã¯ãã®å Žåã®ãã³ãã¬ãŒãã®ç¹æ®åã眮ãæããŸãã
ãã1ã€ã®èå³æ·±ãç¹ã¯ã éçifïŒïŒãã¹ã³ãŒããå€æŽããªãå Žå ãäžæ¬åŒ§ã®åŸãèŠãŠãã ããïŒ
16 static if() { 19 immutable lowSliceIdx=3; 20 } else { 22 immutable lowSliceIdx=2; 23 } 41 return getoptImpl(args, cfg, rslt, opts[lowSliceIdx .. $]);
lowSliceIdxå€æ°ã¯ãããã¯ã®1ã€ã§å®çŸ©ãããŠããŸããããããã¯ãããã¯ã®å€ã§äœ¿çšãããŸããç§ã®æèŠã§ã¯éåžžã«è«ççã§ãã ãã®å€æ°ã¯äžå€ïŒ= constexprïŒãšããŠå®çŸ©ãããŠãããããã³ã³ãã€ã«æã«ã䜿çšã§ãããã³ãã¬ãŒãã§äœ¿çšã§ããŸãã
ãªãã·ã§ã³ã®åæãšåã®å®éã®äœæ¥ãå§ãŸãå Žæã詳ããèŠãŠã¿ãŸãããã
6 static if( is(typeof(opts[0]) : config)) { 7 // it's a configuration flag, act on it 8 setConfig(cfg, opts[0]); 9 return getoptImpl(args, cfg, rslt, opts[1 .. $]); 10 } else { ...... 42 }
ãããããã«ããïŒ Dã§ã¯ãC ++ã§åŸ æã®typeofïŒexprïŒãäœæããæå³ãããšããã«æ©èœããŸãã ããããããã ãã§ã¯ãããŸãããåŒã¯ïŒT == UïŒã§ããåTãšUãçããå ŽåïŒãã¡ããã³ã³ãã€ã«äžã«ïŒããã³ãã¬ãŒããã©ã¡ãŒã¿ãŒããã³ãã®ä»ã®ãŠãŒã¹ã±ãŒã¹ã䜿çšããå Žåã«ã®ã¿ãã¿ã€ãã äžè¬çã«ã isïŒïŒã¯ãåŒæ°ãããããã®åã§ããå Žåãã€ãŸãåŒãæ§æçã«æ£ããå Žåã«ã®ã¿trueãè¿ãã€ã³ã©ã€ã³SFINAEã§ãã ããšãã°ã isïŒarg == U []ãUïŒã¯argãé åã§ããããšã確èªãã ïŒargïŒintïŒ -argã¯èªåçã«intã«å€æã§ããŸããã³ãã³ã¯æ§ããã«ç¶æ¿ã瀺åããŸãã åŸã§ããã«äŸããããŸãã ãããã£ãŠã6è¡ç®ã®åŒã¯ãæåã®ãã©ã¡ãŒã¿ãŒã®ã¿ã€ãïŒ typeofïŒopt [0]ïŒãç¹å®ã®ã¿ã€ãã®configã«ãã£ã¹ããããŠãããã©ãããéçã«ãã§ãã¯ããŸããconfigã¯ãå¯èœãªãã¹ãŠã®ãªãã·ã§ã³ä¿®é£Ÿåã®åãªãåæã§ãïŒ
enum config { /// Turns case sensitivity on caseSensitive, /// Turns case sensitivity off caseInsensitive, /// Turns bundling on bundling, /// Turns bundling off noBundling, /// Pass unrecognized arguments through passThrough, /// Signal unrecognized arguments as errors noPassThrough, /// Stop at first argument that does not look like an option stopOnFirstNonOption, /// Do not erase the endOfOptions separator from args keepEndOfOptions, /// Makes the next option a required option required }
ãã®åŸã getoptImplïŒïŒã¯ä¿®é£Ÿåã®å€ãä¿åãïŒä¿å+å€=>ã©ã³ã¿ã€ã ïŒããªãã·ã§ã³ããæåã®åŒæ°ïŒ opt [1 .. $] ïŒãåé€ããããšã§ååž°çã«èªèº«ãååŒã³åºãããŸãã ãããã£ãŠãååŠçã®æåã®ã±ãŒã¹ãèãåºãããšãããé©ãã»ã©åçŽã§ããã ãããã®ç¡éã®ã³ã³ãã€ã«æé/ã©ã³ã¿ã€ã ãé ã®å€ã«æããŠã³ãŒãããã®ãŸãŸèªãã§ã typeofïŒTïŒã«åºäŒã£ããšãããã®ã¿ã€ããå®çŸ©ãããŠããå ŽæãŸã§ã®ããŒãžãæ€çŽ¢ããŸãïŒãã®å Žåãå®éã®getoptïŒïŒãã©ã¡ãŒã¿ãŒã®ãªã¹ãã§ã¯ãäžå¿«ã§ãïŒ C ++ã§ã¯ãéæ³ã®ããã«èŠããŸããããããšãæå³ãããã®ã§ããããïŒçµå±ã®ãšãããã³ã³ãã€ã©ãŒã¯å ¥åã³ãŒãã®åœ¢ã§ç§ãšåãæ å ±ããã¹ãŠæã£ãŠããŸãã
次ã«ãå ¥åé åããèŠçŽ ã1ã€ãã€ååž°çã«åãåºããšãã³ã³ãã€ã©ã¯æåã®æååãã©ã¡ãŒã¿ãŒãååŸããŸãããã®ãã©ã¡ãŒã¿ãŒã¯ããã®ãªãã·ã§ã³ã®ã¿ã°ã®ãªã¹ãã§ããå¿ èŠããããŸãã11è¡ç®ããããããªãã·ã§ã³ãéå§ããŸããããããéåžžã«ç°¡åã«è§£æ±ºãããŸãã2çªç®ã®ïŒæ¬¡ã®ïŒãã©ã¡ãŒã¿ãŒãæååã®å Žåãããã¯èª¬æã§ããã3çªç®ã¯ãããããã³ãã©ãŒã®ã¢ãã¬ã¹ã§ãã ãã以å€ã®å ŽåïŒã¹ããªã³ã°ã§ã¯ãªãïŒãããã¯ãã³ãã©ãŒã§ãã ãããã£ãŠããªã¹ããã3ã€ãŸãã¯2ã€ã®ãã©ã¡ãŒã¿ãŒãåãåºããŠã次ã®é¢æ°handleOptionïŒïŒã«æž¡ããŸãããã®é¢æ°ã¯ã³ãã³ãã©ã€ã³èªäœãæ¢ã«è§£æããèªç¶ã«ååž°çã«åŒã³åºããŠããã¹ãŠãæåããããçŽããŸãã
ãã§ã«èŠããã®ãšæ¯èŒããŠã次ã«äœãæ°ããããšã¯èµ·ãããŸããã handleOptionïŒïŒé¢æ°ã¯ãåäžã®ãã©ã¡ãŒã¿ãŒïŒãã³ãã©ãŒã®ã¿ã€ãïŒãæã€ãã³ãã¬ãŒãã§ãã³ãã³ãã©ã€ã³å šäœãééãã説æã«é©åãããã©ããã確èªããèŠã€ãã£ãå Žåã¯ãã®ãã³ãã©ãŒã«å¯Ÿå¿ããã¢ã¯ã·ã§ã³ãå®è¡ããŸãã ç§ã®èŠ³ç¹ããæãèå³æ·±ãç¹ãç°¡åã«æ€èšããŸãã
ãŸããäžè¬çãªäžé¢å³ïŒ
static if(is(typeof(*receiver) == bool)) { *receiver=true; } else { // non-boolean option, which might include an argument static if(is(typeof(*receiver) == enum)) { *receiver=to!(typeof(*receiver))(val); } else static if(is(typeof(*receiver) : real)) { *receiver=to!(typeof(*receiver))(val); } else static if(is(typeof(*receiver) == string)) { *receiver=to!(typeof(*receiver))(val); } else static if(is(typeof(receiver) == delegate) || is(typeof(*receiver) == function)) { // functor with two, one or no parameters static if(is(typeof(receiver("", "")) : void)) { receiver(option, val); } else static if(is(typeof(receiver("")) : void)) { receiver(option); } else { static assert(is(typeof(receiver()) : void)); receiver(); } } else static if(isArray!(typeof(*receiver))) { foreach (elem; ...) *receiver ~= elem; } else static if(isAssociativeArray!(typeof(*receiver))) { foreach (k, v; ...) (*receiver)[k]=v; } else { static assert(false, "Dunno how to deal with type " ~ typeof(receiver).stringof); } }
ç¹°ãè¿ãå¯èœãªãã¶ã€ã³
static if(is(typeof(*receiver) == ...)) { *receiver=to!(typeof(*receiver))(val);
å®éã«ã¯ããäœããžã®ãã€ã³ã¿ãŒããã³ãã©ãŒãšããŠæž¡ãããå ŽåãåŒæ°ããã®ã¿ã€ãã«å€æããŠããã€ã³ã¿ãŒã«å²ãåœãŠãŠã¿ãŠãã ããããšããæå³ã§ãã
åŒæ°ãæããªãboolãžã®åå¥ã«åŠçããããã€ã³ã¿ãŒã åŒæ°ãã³ã³ããã«è¿œå ãããé åããã³é£æ³é åã åæ§ã«ã1ã€ã2ã€ããŸãã¯åŒæ°ãæããªãé¢æ°ãšã©ã ãé¢æ°ã å éšé¢æ°ã¿ã€ãã»ã¬ã¯ã¿ãŒã«æ³šæããŠãã ããïŒ
static if(is(typeof(receiver("", "")) : void)) { receiver(option, val); } else static if(is(typeof(receiver("")) : void)) { receiver(option); } else { static assert(is(typeof(receiver()) : void)); receiver(); }
ããã¯ãåŒisïŒTïŒã®ãã1ã€ã®äœ¿çšäŸã§ãããTãæ¢åã®åã§ããå Žåã«ã®ã¿çã«ãªããŸã ã ãã®ç¹å®ã®ã±ãŒã¹ã§ã¯ãé¢æ°ã«ãã£ãŠè¿ãããåã調ã¹ãŸãïŒ*ã¬ã·ãŒããŒïŒïŒïŒãïŒ*ã¬ã·ãŒããŒïŒïŒ ""ïŒãŸãã¯ïŒ*ã¬ã·ãŒããŒïŒïŒ ""ã ""ïŒ ãé¢æ°ã®çœ²åãååšããå ŽåãåãååšããŸãã SFINAE ïŒ voidã¯ãã«ã¿ã€ãã§ãïŒ
ãŸãã std.convã¢ãžã¥ãŒã«ãããŠãããŒãµã«Dã³ã³ããŒã¿ãŒã«æ £ããã®ã䟿å©ã§ãïŒ toïŒïŒTïŒïŒ<lexical>ïŒ ã boost :: lexical_castã®ããã«æ©èœããŸããããããšã¯å¯Ÿç §çã«ãDã¯äžèšã®ã³ãŒãã§ãããããã«ãã³ã³ãã€ã«æéã
ããã ãã§ãçŽ400è¡ã®æå³ã®ããã³ãŒãè¡ã«ããªãè€éãªé¢æ°ãå®è£ ããããã®çµæãC ++ã§ã®åçŸã¯å¯èœãªéãéåžžã«å°é£ã«ãªããŸãã ããŠãé çªã«ãDã§åãæäœããæ©èœ-å¯å€æ°ã®åŒæ°ãæã€ãã³ãã¬ãŒãé¢æ°ãã³ã³ãã€ã«æã®åãšã³ãŒãåå²ã®éžæãããã³åå€æã®æ©èœã«ç²ŸéããŸããã å®éãããã¯Dãéçºè ã«æäŸããããŒã«ã®ããäžéšã«ãããããµã€ãã«ã¯ããŸããŸãªãããã¯ã«é¢ããèšå€§ãªèšäºã®ã³ã¬ã¯ã·ã§ã³ããããŸãã Dã«åãæ¿ããããšãDãåŠã¶ããšãã ãã«ãå§ããªããã奜å¥å¿ãšæ°ããããšã«èå³ãæã£ãŠãããªããããã¯å°ãªããšãè¡šé¢çã«ç¥ã£ãŠããã¹ãèšèªã§ããã
çŽç²ãªçç±ã®æ¹å€
ããããç§ã¯æ¹å€ã«æµæããããšã¯ã§ããŸãããç§ã¯ééããªãææ¡ãããå®è£ ã§äœãã奜ãã§ã¯ãããŸããã æŠããŠãããã¯èšèªèªäœãšã¯äœã®é¢ä¿ããããŸããããäžè¬çãªããã°ã©ãã³ã°ã®èŠ³ç¹ããè°è«ããããšã¯èå³æ·±ããã®ã§ãããŸãããã®å®è£ ã¯single-passã«ãªããŸããã€ãŸãããªãã·ã§ã³ããªã¹ãããååŸãããã³ãã³ãã©ã€ã³ãã¹ãããã«äœæãããæåã«èŠã€ãã£ãäžèŽãã«ãŒããäžæããŸãã ããã¯ã -qqqããéãã§éããªãããã«éããªãã®å矩èªãšããŠèšè¿°ã§ããªãããšããŸãã¯--map A = 1ã®ä»£ããã«--map A = 1 --map B = 2 --map C = 3ãèšè¿°ã§ããªãããšãæå³ããŸãã 2ãC = 3 ããã¯äžè¬ã«ãã°ã§ã¯ãããŸãããã getoptïŒïŒã䜿çšããéã«ç¢ºç«ãããèŠåã«éåãããããåŸæ¥ã®åäœã確èªããããšæããŸãã
第äºã«ãããã¯ãã§ã«ç§ã®æèŠã§ã¯æ·±å»ãªã¢ãŒããã¯ãã£äžã®ééãã§ããé¢æ°ã¯æ§æãã«ãã䜿çšããŠç¹å®ã®æ§é ãè¿ããŸããããã¯éåžž-h | --helpããŒã䜿çšããŠåºåãããŸããããã®åãé¢æ°ã¯ãšã©ãŒã®å Žåã«äŸå€ãã¹ããŒããŸã ã€ãŸããã³ãã³ãã©ã€ã³ã§ãã¹ããããšãããã°ã©ã ã¯ãã®æ¹æ³ãäŒããããšãã§ããªããªããŸãã äžè¬çã«èšãã°ãããã¯åãã·ã³ã°ã«ãã¹å®è£ ããæ¥ãŠããŸãã
UPDïŒAlexandrescuã¯Habrãèªã¿ãŸããïŒ
ããã«ãããã€ãã®å°ããªæ¬ é¥ããããŸããããšãã°ããªãã·ã§ã³ã«ã¯å¥œããªã ãå矩èªãå«ããããšãã§ããŸãããæåã®2ã€ã ããæ§æãã«ãã«è©²åœããŸãããªãã·ã§ã³ãx | abscissa | initialXãã§ã¯ãæåŸã®å€ã¯ã³ãŒãã調ã¹ãããšã«ãã£ãŠã®ã¿èŠã€ããããšãã§ããŸã ããŠãããããããããããªããšã
ååã®ã³ãããã§ã¯ãããã¯ä¿®æ£ãããŸããããç§ãããããã«å®å
šã«ã¯ä¿®æ£ãããŸããã§ããããããã§ãä¿®æ£ãããŸããã
ãããã£ãŠãç§ã¯æŒç¿ãšããŠç¬èªã®å®è£ ãè¡ãããããã®æ¬ ç¹ãä¿®æ£ããããŸããŸãªæ·»ããã®ãäœæããŸããïŒæä»çã«æŒç¿ãšããŠïŒãäžè¬çã«ç§ã¯æãã§ããããã«æ¥œãã¿ãŸããã
ããã«ç§ã®èªè»¢è»ããããŸããïŒ ç§ã®èªè»¢è»ã¯ã©ãã§ããïŒ
ãããããããèªè»¢è»ã¯ä»ããã«ãããŸã ãããã¯èµ·ãããŸãã è¯ãã¬ã€ããã©ãã«æ³ãŸãããç¥ã£ãŠãããšæ±ºããã®ã§ãããã§ãã¢ãŒã¯çµäºã§ãããããããã£ã
æžèª
æåã®3åã®æ¬ãèªãã ã®ã§ãããããã«å¥ã ã®çªå·ãä»ããŸããã ãããã¯ãã¹ãŠè¯ãã§ãããç§ã®å¥œã¿ã¯ã©ããå®ç§ã§ã¯ãªãã®ã§ããµã³ãã€ãããã1ã€ã®ç« ãèªã¿ã察å¿ããä»ã®2ã€ã®ç« ãèªã¿ãŸããã- ããããæŽå²çã«æåã®Dã«é¢ããæ¬
- æ¬ã¢ã¬ã¯ãµã³ãã¬ã¹ã¯
- ãšãŠãçŽ æµãªæçã®æ¬
- Dã«é¢ããä»ã®ãã¹ãŠã®æ¢åã®æ¬
- æžç±ãããããã«èå³æ·±ãèšäºã®éãŸãã§ããããããããå¥ã
ã®ãããã¯ã«ãªã£ãŠããŸã
- ãŠã£ãã¯èšäºãšåããããé¢çœãã§ãããæ®å¿µãªããããªãã¯ããªããæ¢ããŠãããã®ãç¥ãå¿
èŠããããŸã
- ã¡ã€ã³ãµã€ãD
- ãã·ã¢èªçãååšããŸã
- githubã®æšæºã©ã€ãã©ãªã ãœãŒã¹ã¯åãå Žæã§getoptïŒïŒããŸãã