ãŠã£ãããã£ã¢ããïŒã
ããã°ã©ãã³ã°èšèªã®ååä»ããã©ã¡ãŒã¿ãŒã¯ã颿°åŒã³åºãã§æç€ºçãªãã©ã¡ãŒã¿ãŒåã®æå®ããµããŒãããããšãæå³ããŸã ã
ååä»ããã©ã¡ãŒã¿ãŒãåã颿°åŒã³åºãã¯ãæž¡ãããåŒæ°ã颿°åŒã³åºãã®é åºã§ã®ã¿é¢æ°ãã©ã¡ãŒã¿ãŒã«é¢é£ä»ããããéåžžã®é¢æ°åŒã³åºããšã¯ç°ãªããŸã ã
äŸãèŠãŠã¿ãŸãããïŒ
createArray(10, 20);
æ¶ç©ºã®æ¬äŒŒèšèªã®å¥ã®äŸïŒ
window = new Window { xPosition = 10, yPosition = 20, width = 100, height = 50 };
ãã®ã¢ãããŒãã¯ã倿°ã®ãªãã·ã§ã³ãã©ã¡ãŒã¿ãæã€é¢æ°ã§ç¹ã«äŸ¿å©ã§ããåŒã³åºããããšãã«ãããã©ã«ãå€ã®äžéšã®ã¿ã倿Žããå¿
èŠããããŸãã äžéšã®ããã°ã©ãã³ã°èšèªã¯ãååä»ããã©ã¡ãŒã¿ãŒïŒCïŒãObjective-Cãªã©ïŒããµããŒãããŠããŸãããC ++ã¯ãµããŒãããŠããŸããã ãã®æçš¿ã§ã¯ãååä»ããã©ã¡ãŒã¿ãŒãC ++ã§ãšãã¥ã¬ãŒãããããã€ãã®å€å
žçãªæ¹æ³ãèŠãŠãæ°ãããã®ãèããŠã¿ãŸãã
ã³ã¡ã³ã
åœç©ããå§ããŸãããããããæãç°¡åãªæ¹æ³-ã³ã¡ã³ããéããŠååä»ããã©ã¡ãŒã¿ãŒããšãã¥ã¬ãŒãããŸã:)
Window window { 10,
ãã®ã¢ãããŒãã¯ãWindowséçºè
ã®éã§éåžžã«äººæ°ããããŸããMSDNã®äŸã§ã¯ããã®ãããªã³ã¡ã³ããããæäŸãããŠããŸãã
ãååä»ããã©ã¡ãŒã¿ãŒãã®ã€ãã£ãªã
ãã®èãæ¹
㯠ãJavaã§ã®ããã°ã©ãã³ã°ã¹ã¿ã€ã«ã«åºã¥ããŠããŸããã€ãŸãããã¹ãŠã®ãªãã·ã§ã³ãã©ã¡ãŒã¿ãã¡ãœããã®åœ¢åŒã§å«ããããã·ã¯ã©ã¹ãäœæããŸãã ãã®åŸããããã®ã¡ãœããã®åŒã³åºãã®ãã§ãŒã³ã䜿çšããŠãå¿
èŠãªãã©ã¡ãŒã¿ãŒã®ã¿ãèšå®ã§ããŸãã
OpenFileã¯ã©ã¹ã¯ãã©ã¡ãŒã¿ãŒã®ã»ããã§ãããFileã³ã³ã¹ãã©ã¯ã¿ãŒã¯ãã®ã¯ã©ã¹ã®ãªããžã§ã¯ããåãå
¥ããŸãã äžéšã®èè
ïŒããšãã°ã
ãã ïŒã¯ãOpenFileã¯ãã©ã€ããŒãã¡ã³ããŒã®ã¿ãæã¡ãFileã¯ã©ã¹ããã¬ã³ããªãŒã«ããå¿
èŠããããšäž»åŒµããŠããŸãã ãã©ã¡ãŒã¿ãèšå®ããããã«ããè€éãªããžãã¯ã䜿çšããå Žåãããã¯çã«ããªã£ãŠããŸãã ãã ããåçŽãªå€ãå²ãåœãŠãã«ã¯ããããªãã¯ã¡ãœããã䜿çšããäžèšã®ã¹ã¿ã€ã«ã§ååã§ãã
ãã®ã¢ãããŒãã§ã¯ïŒ
- å¿
é ãã©ã¡ãŒã¿ãŒã¯åŒãç¶ãäœçœ®æå®ã§ãïŒOpenFileã³ã³ã¹ãã©ã¯ã¿ãŒã®åŒã³åºãã¯æåã§ãªããã°ãªãããããã¯å€æŽã§ããŸããïŒ
- ãªãã·ã§ã³ã®ãã©ã¡ãŒã¿ãŒã«ã¯ãã³ããŒïŒç§»åïŒã³ã³ã¹ãã©ã¯ã¿ãŒãå¿
èŠã§ã
- 远å ã®ãããã·ã¯ã©ã¹ãèšè¿°ããå¿
èŠããããŸã
ããã©ã¡ãŒã¿ãŒã®ããã±ãŒãžãã®ã€ãã£ãªã
ãã®ã¢ã€ãã¢ã¯ä»¥åã®ã¢ã€ãã¢ã«äŒŒãŠããã
Davide Di Gennaroã®Advanced C ++ Metaprogramming book-ãããã·ãªããžã§ã¯ãã䜿çšããŠä»£å
¥æŒç®åïŒ=ïŒãä»ããŠãã©ã¡ãŒã¿ãŒãèšå®ããæè¡ããåŸããããããæ¬¡ã®æ§æã·ã¥ã¬ãŒãååŸããŸãã
MyFunction(begin(v), end(v), where[logger=clog][comparator=greater<int>()]);
é¢é£ãããšã³ãã£ãã£ïŒ
- ãã¬ãŒãšã³ã³ãã¬ãŒã¿ãŒã¯ã°ããŒãã«å®æ°ã§ãã å²ãåœãŠæŒç®åã¯ãå²ãåœãŠãããå€ã®ã©ãããããã³ããŒãè¿ãã ãã§ã
- ããã§ãããã©ã¡ãŒã¿ã®ããã±ãŒãžãã¿ã€ãã®ã°ããŒãã«å®æ°ã§ãã ãã®æŒç®å[]ã¯ãæ°ãããããã·ãªããžã§ã¯ããè¿ãã ãã§ããã®ã¡ã³ããŒã®1ã€ãæ°ããåŒæ°ã«çœ®ãæããŸãã
æåå
ïŒ
where = {a, b, c } where[logger = x] â { a,b,c }[ argument<0>(x) ] â {x,b,c}
å®è£
ã®æŠèŠïŒ
å®å
šãªã³ãŒãã«ã€ããŠã¯ãå
ã®æ¬ãã芧ãã ããã
ãã®ææ³ã¯è峿·±ãããã«èŠããŸãããå®éã«ã¯ãé©åºŠã«å¿«é©ã§äžè¬çãªãã®ã«ããããšã¯å°é£ã§ãã æ¬ã®äžã§ãããã¯äžè¬ã«ãæã
ãèããŠããåé¡ã解決ããããšã«ãã£ãŠã§ã¯ãªããæŒç®å[]ãžã®ãé£éãåŒã³åºãã®äŸã«ãã£ãŠç€ºãããŸããã
ã¿ã°
AndrzejKrzemieÅskiã¯è峿·±ãæçš¿
ãçŽæçãªã€ã³ã¿ãŒãã§ã€ã¹ããå
¬éããæ¬¡ã®ããšãææ¡ããŸãããååä»ããã©ã¡ãŒã¿ãŒã¯ãã³ã³ãããªã³ã®ãã¢-å®éã®å€ãšç©ºã®æ§é ã§ãïŒç®çã®ãªãŒããŒããŒã颿°ãéžæããã«ã¯ãç°ãªãã¿ã€ãã®ç©ºã®æ§é ãå¿
èŠã§ãïŒã STLããã®ãã®ã¢ãããŒãã®äŸã次ã«ç€ºããŸãã
std::function<void()> f{std::allocator_arg, a};
Andrzejã¯äžè¬åãããã¢ãããŒããææ¡ããŸããïŒ
çè§£ã§ããããã«ããªãŒããŒããŒãããã颿°ãããã€ãäœæããå¿
èŠãããããã©ã¡ãŒã¿ãŒã®é åºãéžæããããšãã§ããŸããã ãã©ã¹ã«ã¯ãã³ããŒ/転éã³ã³ã¹ãã©ã¯ã¿ãŒã®å¿
èŠæ§ã®æ¬ åŠãå«ãŸããŸãã ããã©ã«ããæž¡ãããšãåé¡ãªãæ©èœããŸãã èšäºããïŒãã¿ã°ã¯ãåŒã³åºãããããã€ãã®å Žæã§ã®ã¿åœ¹ç«ã€ãªãŒããŒããŒã颿°ã§åå空éãè©°ãŸããããããçæ³çãªãœãªã¥ãŒã·ã§ã³ã§ã¯ãããŸããã
ããã«ãããèªè
ã¯å¥ã®ã¿ã°å®è£
ã®è¯ãã¢ã€ãã¢ãææ¡ããŸããïŒ
std ::ãã¯ãã«v1ïŒstd :: with_sizeïŒ10ïŒãstd :: with_valueïŒ6ïŒïŒ;
ããŒã¹ã
Boostã«
ã¯ãã©ã¡ãŒã¿ãŒã©ã€ãã©ãªã
ãããŸã ã
ãæ³åã®ãšãããããã¯ããªãå®å
šã§å®çšçãªå®è£
ã§ãã äŸïŒ
ææ°ã®C ++ã®ååä»ããã©ã¡ãŒã¿ãŒ
ææ°ã®C ++èšèªæšæºã¯ãæ°ããæãéããŸãã ãããã®ãããããé©çšããŠåé¡ã解決ã§ãããã©ãããèŠãŠã¿ãŸãããã
ã©ã ãã¹
é£éæ¹æ³ã¯åé·ãããŸãã ãªããžã§ã¯ãèªäœãè¿ãäžé£ã®é¢æ°ã远å ããããããŸããã ã©ã ã颿°ã䜿çšããŠæ§é ãæ±ºå®ãããã®ã¡ã³ããŒãèšå®ããã®ã¯ã©ãã§ããïŒ
struct FileRecipe { string Path;
ãã©ã¡ãŒã¿ãä¿åããããã®ã¯ã©ã¹ãå¿
èŠã§ãããã¢ãããŒãèªäœã¯ããã¹ãŠã®ããã§ãŒã³ã颿°ãæç€ºçã«ç»é²ããå¿
èŠãããååä»ããã©ã¡ãŒã¿ã®å€å
žçãªã€ãã£ãªã ãããåªããŠããŸãã å¥ã®ãªãã·ã§ã³ã¯ãFileRecipeåã®ãªããžã§ã¯ããåãå
¥ããFileã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãäœæããããšã§ãã
å¿
é ãã©ã¡ãŒã¿ãŒã®èªã¿ããããæ¹åããã«ã¯ã©ãããã°ããã§ããïŒ ãã®ã¢ãããŒããšã¿ã°ãçµã¿åãããŠã¿ãŸãããïŒ
auto file = CreateFile( _path, "path", [](auto& r) { r.CreateIfNotExist = true; });
確ãã«ã圌ãã¯ãŸã å®äœçœ®ã§ãã ã©ã³ã¿ã€ã ã«ãå¿
èŠãªãã©ã¡ãŒã¿ãŒããããŸããããšãããšã©ãŒã衚瀺ãããå¯èœæ§ãããå Žåã¯ã
ãªãã·ã§ã³ã®ã¿ã€ãã䜿çšã§ããŸã
ç§ã¯æè¿ããã®ã¢ãããŒãã䜿çšããŠãã¹ããšã¢ãã¯ãæ§æããããšããŸããã ããšãã°ãåçŽãªãµã€ã³ãã²ãŒã ã®ãã¹ããäœæããå¿
èŠããããŸããã æ§æãšãã¹ãã¯æ¬¡ã®ããã«ãªããŸãã
TEST_F(SomeDiceGameConfig, JustTwoTurnsGame) { GameConfiguration gameConfig { 5u, 6, 2u }; }
ãã®ã¢ãããŒãã䜿çšãããšã次ã®ããã«ãªããŸãã
TEST_F(SomeDiceGameConfig, JustTwoTurnsGame) { auto gameConfig = CreateGameConfig( [](auto& r) { r.NumberOfDice = 5u; r.MaxDiceValue = 6; r.NumberOfTurns = 2u; }); }
ãã¯ãã䜿çšããŠãåãã©ã ããåŒã³åºãããåãã¹ãã§ç¹°ãè¿ãããªãããã«ããããšãã§ããŸãã
TEST_F(SomeDiceGameConfig, JustTwoTurnsGame) { auto gameConfig = CREATE_CONFIG( r.NumberOfDice = 5u; r.MaxDiceValue = 6; r.NumberOfTurns = 2u; ); }
å¯å€é·ãã³ãã¬ãŒãã®äœ¿çš
C ++ 11ã§å°å
¥ãããå¯å€é·ãã³ãã¬ãŒãã¯ãäžèšã®æ¹æ³ãæ¹åã§ããŸãã ããäžåºŠã¿ã°ãæãåºããŸãããã ã¿ã°ã¯ãã©ã ã+ãã©ã¡ãŒã¿ãªããžã§ã¯ããããåªããã¢ãããŒãã«ãªããŸããå¥ã®ãªããžã§ã¯ããäœæããå¿
èŠããªããããã³ããŒã³ã³ã¹ãã©ã¯ã¿ã«ã¯åé¡ããªãããã¹ãŠã®ãã©ã¡ãŒã¿ã¯åãæ¹æ³ã§åŠçãããŸãïŒã©ã ãã§ã¯ãå¿
èŠãªãã©ã¡ãŒã¿ãå¥ã
ã«åŠçããå¿
èŠããããŸããïŒã ãã ããã¿ã°ã¯æ¬¡ã®å Žåã«ã®ã¿ååãªã¢ãããŒãã«ãªããŸãã
- ãªãŒããŒããŒããããã³ã³ã¹ãã©ã¯ã¿ãŒãŸãã¯é¢æ°ã1ã€ã ã宣èšããŠååŸãã
- ãã©ã¡ãŒã¿ãŒã®é åºãèªç±ã«æ±ºå®ããæ©äŒãåŸãŸãïŒãã¿ã°å€ãã®ãã¢ïŒ
- å¿
é ãã©ã¡ãŒã¿ãŒãšãªãã·ã§ã³ãã©ã¡ãŒã¿ãŒã®äž¡æ¹ããããŸã
次ã®ãããªãã®ïŒ
File f { _readonly, true, _path, "some path" };
ãŸãã¯ïŒ
File f { by_name, Args&&... args) {}
ç§ã®èãã¯æ¬¡ã®ãšããã§ããVariadicãã³ãã¬ãŒãã䜿çšããŠããŠãŒã¶ãŒã«ãã©ã¡ãŒã¿ãŒã®é åºã決å®ãããªãã·ã§ã³ã®ãã©ã¡ãŒã¿ãŒãçç¥ã§ããããã«ããŸãã
2ã€ã®ã³ã³ã¹ãã©ã¯ã¿ãŒãæ³åããŠãã ããã
File(string path, bool readonly, bool createIfNotExist) {}
Fileåã®ãªããžã§ã¯ãã¯ã2ã€ã®æ¹æ³ã®ããããã§äœæã§ããŸãã 2çªç®ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããå Žåãã»ããå
ã®ãã¹ãŠã®ãã©ã¡ãŒã¿ãŒã調ã¹ãŠã察å¿ãããã©ã¡ãŒã¿ãŒã»ããã䜿çšããŠæåã®ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºããŸãã ãã©ã¡ãŒã¿ã®è¡šç€ºãšã³ãŒãã®çæã¯ã³ã³ãã€ã«æ®µéã§å®è¡ãããŸããããã¯ç·åœ¢ã®æéãèŠããã©ã³ã¿ã€ã ã§ã®åŒã³åºãã«è²»ããããæéã«ã¯åœ±é¿ããŸããã
ãã®å®è£
ã¯åãªãã¹ã±ããã§ããã確å®ã«æ¹åããããšãã§ããŸãã
ã¯ã©ã¹ã®èšè𿹿³ã¯æ¬¡ã®ãšããã§ãã
File(string path, bool readonly, bool createIfNotExists ) : _path (move(path)), _createIfNotExist(createIfNotExist), _readonly(readonly)
åäœããã³ãŒãã瀺ãåã«ãåãã¢ã€ãã¢ããããã·ã«é©çšã§ããããšãæç¢ºã«ããŸãããã
auto f = File { by_name, readonly=true, path="path" };
ããã§ã®äž»ãªéãã¯ãåŒæ°ãæž¡ãããšã«ãããŸãããããã·ã§ã¯ãæ§æç³ïŒæŒç®å=ïŒãååŸããŸãããå€ãæ ŒçŽããŠæž¡ãå¿
èŠããããŸãïŒç§»åäžå¯èœ/ã³ããŒåã«ã¯ããŸãé©ããŠããŸããïŒã
ããã§ãã³ãŒãã詊ãããšãã§ããŸãã ã¿ã°ä»ãããŒãžã§ã³ããå§ããŠãããããã·ã«åãæ¿ãããããäž¡æ¹ã®ããŒãžã§ã³ããããŸãã ãPACK UTILSããšåŒã°ãã2ã€ã®ã»ã¯ã·ã§ã³ããããŸãïŒã¿ã°ãšãããã·çšïŒã
ã¯ã©ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
class window { public:
ã芧ã®ãšãããäž¡æ¹ã®æåŸã®ã³ã³ã¹ãã©ã¯ã¿ãŒã¯åžžã«ãã¯ã©ã·ãã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºããŠå®éã®äœæ¥ãè¡ããŸãã
次ã®ã³ãŒãã¯ããŠãŒã¶ãŒããªããžã§ã¯ããäœæããæ¹æ³ã瀺ããŠããŸãã
int i=5;
é·æïŒ
- å¿
é ããã³ãªãã·ã§ã³ã®ãã©ã¡ãŒã¿ãŒã¯åäžã«äœ¿çšãããŸãã
- é åºã¯å³å¯ã«å®çŸ©ãããŠããŸãã
- ã¿ã°ä»ãã¡ãœããã«ã¯ããã©ã¡ãŒã¿ãŒã®åãæž¡ãã«é¢é£ããæ¬ ç¹ã¯ãããŸãã
- ãããã·ã䜿çšããã¡ãœããã¯éåžžã«æçœã§ãïŒæŒç®å=ã®ããïŒ
çæïŒ
- ã³ã³ãã€ã«æ®µéã§ã®ãšã©ãŒã¯çè§£ãã«ããå ŽåããããŸãïŒstatic_assertã圹ç«ã€å ŽåããããŸãïŒ
- å©çšå¯èœãªãã©ã¡ãŒã¿ãææžåããå¿
èŠããããŸãã
- äžèŠãªé¢æ°/ã³ã³ã¹ãã©ã¯ã¿ãŒã«ããåå空éã®ãæ±æã
- ããã©ã«ãå€ã¯åžžã«èšç®ãããŸãã
- ã¿ã°ä»ãã¡ãœããã¯ãå¯èŠæ§ã®ç¹ã§å®å
šã§ã¯ãããŸããïŒã¿ã°ãšå€ã¯ã³ã³ãã«åŸããŸãïŒ
- ãããã·ã¡ãœããã¯ããã©ã¡ãŒã¿ãŒãæž¡ããšããç¹ã§ã¯çæ³çã§ã¯ãããŸããã
æåã®åé¡ã«æ³šæããŠãã ããïŒClangã¯åé¡ãéåžžã«æç¢ºã«å ±åããã®ã«ååã¹ããŒãã§ãã ãŠã£ã³ããŠåã®å¿
é ãã©ã¡ãŒã¿ãŒãå¿ããŠããŸã£ãããšãæ³åããŠãã ãããã³ã³ãã€ã©ãŒã®åºåã¯æ¬¡ã®ãšããã§ãã
main.cpp:28:2: error: static_assert failed "Required parameter" static_assert(pos >= 0, "Required parameter"); ^ ~~~~~~~~ main.cpp:217:14: note: in instantiation of template class 'get_at<-1, 0>' requested here : window { REQUIRED_NAME(title), ^
ããã§ãäœãã©ãã§èŠéãããããæ£ç¢ºã«ç¥ãããšãã§ããŸãã
std :: tupleã䜿çšãããããã«ãªã¢ãããŒã
[ãã®æ®µèœã¯Davide Di Gennaroã«ãã£ãŠæžãããŸãã]
ã¿ãã«æ©èœïŒstd :: tupleïŒã䜿çšããŠãã¿ã¹ã¯ã®éåžžã«ã³ã³ãã¯ãã§ç§»æ€å¯èœãªå®è£
ãäœæã§ããŸãã ããã€ãã®ç°¡åãªååã«äŸåããŸãã
- ãã©ã¡ãŒã¿ã®ã»ããã¯ç¹å¥ãªã¿ãã«ã«ãªããåãã¿ã°ã¿ã€ããã®åŸã«å€ãç§»åããŸãïŒã€ãŸããã¿ã€ãã¯ïŒstd :: tuple <age_tagãintãname_tagãstringã...>ïŒã®ããã«ãªããŸãïŒ
- æšæºèšèªã©ã€ãã©ãªã«ã¯ããªããžã§ã¯ããšã¿ãã«ã転é/é£çµããããã®æ©èœããã§ã«å«ãŸããŠãããããã©ãŒãã³ã¹ãšæ£ç¢ºæ§ãä¿èšŒãããŠããŸã
- ãã¯ãã䜿çšããŠãã¿ã°ã衚ãã°ããŒãã«å®æ°ãå®çŸ©ããŸãã
- ãã©ã¡ãŒã¿ã»ãããäœæããããã®æ§æã¯ãïŒtag1 = value1ïŒ+ïŒtag2 = value2ïŒ+ ...
- ã¯ã©ã€ã¢ã³ãã¯ããã³ãã¬ãŒãã¿ã€ããžã®åç
§ãšããŠãã©ã¡ãŒã¿ãŒã»ãããåãå
¥ããŸãã
ãã³ãã¬ãŒã<typename pack_t>
void MyFunctionïŒ[whatever]ãTïŒparameter_packïŒ//ãŸãã¯const TïŒãT &&ãªã©
- 颿°åŒã³åºãå
ã§ãã¯ã©ã€ã¢ã³ãã¯ãã©ã¡ãŒã¿ãŒã®ã»ããããå¿
èŠãªå€ãæœåºããããããäœããã®æ¹æ³ã§äœ¿çšããŸãïŒããšãã°ãããŒã«ã«å€æ°ã«æžã蟌ã¿ãŸãïŒã
namespace tag { CREATE_TAG(age, int); CREATE_TAG(name, std::string); } template <typename pack_t> void MyFunction(T& parameter_pack) { int myage; std::string myname; bool b1 = extract_from_pack(tag::name, myname, parameter_pack); bool b2 = extract_from_pack(tag::age, myage, parameter_pack); assert(b1 && myname == "John"); assert(b2 && myage == 18); } int main() { auto pack = (tag::age=18)+(tag::name="John"); MyFunction(pack); }
ãã®ã¢ã€ãã¢ã®å®è£
ã¯æ¬¡ã®ããã«ãªããŸãã
æåã®ãã¯ãïŒ
#include <tuple> #include <utility> template <typename T> struct parameter {}; #define CREATE_TAG(name, TYPE) \ \ struct name##_t \ { \ std::tuple<parameter<name##_t>, TYPE> operator=(TYPE&& x) const \ { return std::forward_as_tuple(parameter<name##_t>(), x); } \ \ name##_t(int) {} \ }; \ \ const name##_t name = 0
ãã¯ãCREATE_TAGïŒageãintïŒãå±éãããšãã¯ã©ã¹ãšã°ããŒãã«ãªããžã§ã¯ããäœæãããŸãã
struct age_t { std::tuple<parameter<age_t>, int> operator=(int&& x) const { return std::forward_as_tuple(parameter<age_t>(), x); } age_t(int) {} }; const age_t age = 0;
æŠå¿µçã«å²ãåœãŠ
age = 18
次ã®ãããªãã®ã«å€æããŸãã
make_tuple(parameter<age_t>(), 18);
ç§ãã¡ãæžããããšã«æ³šæããŠãã ããïŒ
std::tuple<parameter<age_t>, int> operator=(int&& x) const
å³åŽã«rå€ãå¿
èŠã§ãã ããã¯ã»ãã¥ãªãã£ã®ããã«è¡ãããŸãããã©ã¡ãŒã¿ã»ããã䜿çšããŠã³ãŒããèªã¿ãããããããã«ã倿°ã§ã¯ãªã宿°ãå²ãåœãŠãããšãã§ããŸãã
int myage = 18; f(myage);
ããã«ãç§»åã®ã»ãã³ãã£ã¯ã¹ã䜿çšã§ããŸãã
ã®éã
std::tuple<parameter<age_t>, int> operator=(int&& x) const { return std::make_tuple(parameter<age_t>(), x); }
ãããŠ
std::tuple<parameter<age_t>, int> operator=(int&& x) const { return std::forward_as_tuple(parameter<age_t>(), x); }
ãšãŠãèãã åŸè
ã®å Žåãstd :: tuple <...ãint &&>ãè¿ãããŸããã颿°ãstd :: tuple <...ãint>ãè¿ããããç§»åã³ã³ã¹ãã©ã¯ã¿std :: tupleãåŒã³åºãããŸãã
å¥ã®æ¹æ³ãšããŠã次ã®ããã«æžãããšãã§ããŸãã
std::tuple<parameter<age_t>, int> operator=(int&& x) const { return std::make_tuple(parameter<age_t>(), std::move(x)); }
ãããŠãã¿ãã«ã«é©ããé£çµæŒç®åãäœæããŸãã
ãã©ã¡ãŒã¿ã§å§ãŸããã¹ãŠã®ã¿ãã«ãã³ãŒãã«ãã£ãŠäœæãããããšã«æé»çã«åæãããããæç€ºçãªæ€èšŒãè¡ããã«ãåã«ãã©ã¡ãŒã¿ãç Žæ£ããŸãã
template <typename TAG1, typename... P1, typename TAG2, typename... P2> std::tuple<parameter<TAG1>, P1..., parameter<TAG2>, P2...> operator+ (std::tuple<parameter<TAG1>, P1...>&& pack1, std::tuple<parameter<TAG2>, P2...>&& pack2) { return std::tuple_cat(pack1, pack2); }
éåžžã«åçŽãªæ©èœïŒäž¡æ¹ã®ã¿ãã«ã次ã®åœ¢åŒã§ããããšã確èªããŸã
tuple<parameter<tag>, type, [maybe something else]>
ããããæ¥ç¶ããŸãã
ãããŠæåŸã«ãã»ããããåŒæ°ãæœåºãã颿°ãäœæããŸãã ãã®é¢æ°ã«ã¯è»¢éã»ãã³ãã£ã¯ã¹ãããããšã«æ³šæããŠãã ããïŒã€ãŸããåŒã³åºãåŸããã©ã¡ãŒã¿ãŒã¯ã»ããããæœåºãããŸãïŒã
template <typename TAG, typename T, typename... P, typename TAG1> bool extract_from_pack(TAG tag, T& var, std::tuple<parameter<TAG1>, P...>& pack);
次ã®ããã«æ©èœããŸããã»ããã«ãã©ã¡ãŒã¿ãŒãå«ãŸããŠããå Žåã倿°ã¯ãã®çŽåŸã®å€ãåãåãã颿°ã¯trueãè¿ããŸãã ããããªããšãäœãæªãããšãèµ·ãããŸãïŒã³ã³ãã€ã«ãšã©ãŒãéžæããfalseãè¿ããäŸå€ãã¹ããŒã§ããŸãïŒã
ãã®éžæãå¯èœã«ããããã颿°ã¯æ¬¡ã®ããã«ãªããŸãã
template <typename ERR, typename TAG, typename T, typename... P, typename TAG1> bool extract_from_pack(TAG tag, T& var, std::tuple<parameter<TAG1>, P...>& pack)
次ã®ããã«åŒã³åºããŸãã
extract_from_pack< erorr_policy > (age, myage, mypack);
å¯å€é·ãã³ãã¬ãŒãã䜿çšããããã®èŠåãèæ
®ããŠãextract_from_packã¯ãã©ã¡ãŒã¿ãŒã»ãããã¿ãã«<ãã©ã¡ãŒã¿ãŒã...>ã®åœ¢åŒã§ããããšãèªèããŠãããããTAGãTAG1ãšçãããã©ãããååž°çã«ç¢ºèªããå¿
èŠããããŸãã ã¯ã©ã¹ãåŒã³åºãããšã§ãããå®è£
ããŸãã
extract_from_pack< erorr_policy > (age, myage, mypack);
åå
extractor<0, erorr_policy >::extract (age, myage, mypack);
ããã«åå
extractor<0, erorr_policy >::extract (age, myage, std::get<0>(pack), mypack);
次ã®2ã€ã®ãªãŒããŒããŒããªãã·ã§ã³ããããŸãã
extract(TAG, ⊠, TAG, âŠ)
å®è¡ãããå Žåãå²ãåœãŠãå®è¡ããtrueãŸãã¯
extract(TAG, ⊠, DIFFERENT_TAG, âŠ)
ç¹°ãè¿ããç¶ããŠãå床åŒã³åºããŸã
extractor<2, erorr_policy >::extract (age, myage, mypack);
å埩ãç¶ç¶ã§ããªãå Žåãerror_policy :: errïŒ...ïŒãåŒã³åºãããŸã
template <size_t N, typename ERR> struct extractor { template <typename USERTAG, typename T, typename TAG, typename... P> static bool extract(USERTAG tag, T& var, std::tuple<parameter<TAG>, P...>&& pack) { return extract(tag, var, std::get<N>(pack), std::move(pack)); } template <typename USERTAG, typename T, typename TAG, typename... P> static bool extract(USERTAG tag, T& var, parameter<TAG> p0, std::tuple<P...>&& pack) { return extractor<(N+2 >= sizeof...(P)) ? size_t(-1) : N+2, ERR>::extract(tag, var, std::move(pack)); } template <typename USERTAG, typename T, typename... P> static bool extract(USERTAG tag, T& var, parameter<USERTAG>, std::tuple<P...>&& pack) { var = std::move(std::get<N+1>(pack)); return true; } }; template <typename ERR> struct extractor<size_t(-1), ERR> { template <typename TAG, typename T, typename DIFFERENT_TAG, typename... P> static bool extract(TAG tag, T& var, std::tuple<parameter<DIFFERENT_TAG>, P...>&& pack) { return ERR::err(tag); } }; template <typename ERR, typename TAG, typename T, typename... P, typename TAG1> bool extract_from_pack(TAG tag, T& var, std::tuple<parameter<TAG1>, P...>& pack) { return extractor<0, ERR>::extract(tag, var, std::move(pack)); }
ãã©ã¡ãŒã¿ãŒã»ããã®æè»ãªæ§è³ªã«ããããfalseãè¿ãããæè¯ã®ãšã©ãŒåŠçããªã·ãŒãšèŠãªãããšãã§ããŸãïŒå®éã«ã¯ãããå³å¯ãªåäœã¯åãã©ã¡ãŒã¿ãŒãå¿
é ã§ããããšãæå³ããŸãïŒã
struct soft_error { template <typename T> static bool err(T) { return false; } };
ããã§ããäœããã®çç±ã§å¿
èŠãªå Žåã¯ã次ã®2ã€ããéžæã§ããŸãã
struct hard_error { template <typename T> static bool err(T);
远å ã®æ¹åã¯ã次ã®ãããªå Žåã®åé·æ§ãã¹ãã§ãã
(age=18)+(age=19)
æçµããŒã
次ã®ãããªã©ã³ã¿ã€ã ææ³ã«ã€ããŠã¯èª¬æããŸããã§ããã
void MyFunction (option_parser& pack) { auto name = pack.require("name").as<string>(); auto age = pack.optional("age", []{ return 10; }).as<int>(); ... }
ã³ãŒãã¯å®è¡æã«åäœããäœæ¥äžã«å¿
èŠãªãã©ã¡ãŒã¿ãŒãååŸããããšãããããæéã®ç¡é§ããããŸãããŸãããšã©ãŒãçºçããå Žåã«ã®ã¿ãšã©ãŒãç¥ãããšãã§ããŸãã ã³ãŒãã¯çæ³ããã¯ã»ã©é ãã§ãããæŠå¿µã®èšŒæããšããŠã®ã¿åŒçšããŠããŸããããã®åœ¢åŒã§ã¯å®éã®ãããžã§ã¯ãã§äœ¿çšã§ãããšã¯æããŸããã
ãŸãã
ããã§ C ++èšèªæšæºã«ååä»ããã©ã¡ãŒã¿ãŒã远å ããææ¡ãèŠã€ããŸããã ããã§ããã