Upgrade to Pro — share decks privately, control downloads, hide ads and more …

C++17 std::anyについて

C++17 std::anyについて

nakameguro_feature.cpp vol.10
https://ebisu-effective-modern-cpp.connpass.com/event/104657/

での資料です!!

Nobuyuki Nishiyama

October 18, 2018
Tweet

More Decks by Nobuyuki Nishiyama

Other Decks in Programming

Transcript

  1. $TUEBOZ
    ໨࣍
    ࣗݾ঺հ
    ࠓ೔࿩͢͜ͱ
    * ͷ࢖͍ํ
    * ͷศརͳ࢖͍ํ
    ࢀߟࢿྉ
    ࣗݾ঺հ
    ੢ࢁ৴ߦ
    ೥͔ΒήʔϜϓϩάϥϚͱͯ͠׆ಈ
    1$ɺՈఉ༻ήʔϜػɺεϚϗ
    ઐ໳ֶߍͰήʔϜϓϩάϥϛϯάΛڭ͑Δ
    ೔ຊిࢠઐ໳ֶߍ d

    ओʹ࣮श؂ಜ
    όϯλϯήʔϜΞΧσϛʔ d

    ʮ$ͰήʔϜΛ࡞ΔʯΈ͍ͨͳ಺༰Ͱ·Δͬͱतۀ
    $Λ৮Γ࢝Ίͨͷ͸೥͘Β͍͔Β

    View Slide

  2. J04ͰήʔϜΛ࡞͍ͬͯ·͢
    ࠓ೔࿩͢͜ͱ
    $Ͱ௥Ճ͞Εͨ* ͷ࢖͍ํͱศརͳ࢖͍ํ
    ͳʹͿΜ$ॳ৺ऀͳͷͰποίϛ͓ئ͍͠·͢

    ͷ࢖͍ํ
    ΊͬͪΌ͍͍ࢿྉΛݟ͚ͭͨͷͰɺͦΕΛ࢖͍·͢
    IUUQTHJUIVCDPN&[PF3ZPVDQQCPPLCMPCNBTUFSDQQMJCBOZNE
    ิ଍
    #include
    #include
    #include
    int main()
    {
    // sd p o
    auto a = std::make_any>({ 0, 1, 2, 3 });
    std::cout << std::any_cast>(a)[1]

    View Slide


  3. ͷศརͳ࢖͍ํ
    * ʹ͍ͭͯ͸Θ͔͖ͬͯͨͷͰɺͲΜͳ࣌ʹ࢖͑Δͷ͔ͷ঺հ
    ίϯςφͱซͤͯ࢖͏
    << std::endl;
    }
    #include
    #include
    #include
    #include
    int main()
    {
    // std::vector
    auto a = std::vector{ -1, 8.5, "Hoge" };
    std::cout << std::any_cast(a[2])
    << std::endl;
    // std::map
    auto b = std::map{
    { "a", -1 },
    { "b", 8.5 },
    { "c", "Hoge" },
    };

    View Slide

  4. ԿͰ΋֨ೲͰ͖Δίϯςφܕ҆શੑͱ͸
    * ͸ ͕ແ͍ͷͰTUETFUʹ͸࢖͑ͣɻ
    +40/ͷಡΈॻ͖Ͱ࢖͑ͦ͏
    ਺஋ͱจࣈྻͷೖΓཚΕͨ஋ΛखؒΛ͔͚ͣʹѻ͑ͦ͏
    Πϕϯτॲཧ
    ήʔϜͰ͋Γ͕ͪͳ˓˓͖͔͚ͬͰॲཧΛ͢ΔΛߟ͑Δ
    std::cout << std::any_cast(b.at("b"))
    << std::endl;
    }
    #include
    #include
    int main()
    {
    std::set s;
    std::any a;
    s.insert(a);
    }
    LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp)

    View Slide

  5. 8JOEPXTͰΞϓϦΛ࡞Δͱ͖ͷϝοηʔδॲཧΛ͓खຊʹͯ͠ΈΔ
    {
    switch (msg)
    {
    case WM_DESTROY: // Window <
    PostQuitMessage(0);
    return 0;
    case WM_LBUTTONDOWN: //
    DoAnything(); //
    return 0;
    }
    return DefWindowProc(hwnd , msg , wp , lp);
    }
    #include
    #include
    #include
    //
    enum {
    GAME_START,
    GAME_END,
    PLAYER_DEAD,
    };
    //
    struct Item
    {
    // r t
    void event(int event_type)

    View Slide

  6. {
    switch (event_type)
    {
    case GAME_START:
    // r
    break;
    default:
    break;
    }
    }
    };
    // r
    void EventProc(int event_type)
    {
    switch (event_type)
    {
    case GAME_START:
    // r
    break;
    default:
    break;
    }
    }
    int main()
    {
    Item a;
    // t
    std::vector> func;

    View Slide

  7. ؔ਺΍ϝϯόؔ਺Λɺؔ਺ϙΠϯλͱͯ͠ొ࿥ͯ͠ஞ࣍ݺͼग़͢ͷ͸͙͢Ͱ͖Δ͕ɺ໰୊ͳͷ͕ίʔϧόοΫؔ਺ͷʮҾ
    ਺ʯͷܕɻ
    $ݴޠͰ࣮૷͍ͯͨ࣌͠͸ Ͱͨ͠
    ͦ͜ͰҾ਺Λ* ʹͯ͠ΈΔ
    //
    func.push_back(std::bind(&Item::event, &a, std::placeholders::_1));
    func.push_back(EventProc);
    // : v r
    for (auto& f : func)
    {
    f(GAME_START);
    }
    }
    #include
    #include
    #include
    enum {
    GAME_START,
    GAME_END,
    PLAYER_DEAD,
    };
    // GAME_START i t
    struct GameStartArg

    View Slide

  8. {
    int a;
    float b;
    };
    void EventProc(int event_type, std::any& arg)
    {
    switch (event_type)
    {
    case GAME_START:
    {
    // t o
    auto& a = std::any_cast(arg);
    }
    break;
    default:
    break;
    }
    }
    int main()
    {
    // t ay
    std::vector> func;
    //
    func.push_back(EventProc);
    // : t v r
    auto arg = std::make_any(GameStartArg{ -1, 0.5f });
    for (auto& f : func)
    {

    View Slide

  9. Ҿ਺༻ͷߏ଄ମΛ͍͍ͪͪఆٛ͢Δͷ͕ΊΜͲ͘͘͞ͳͬͨͷͰɺࠓ͸͜ͷํࣜ
    f(GAME_START, arg);
    }
    }
    #include
    #include
    #include
    #include
    #include
    enum {
    GAME_START,
    GAME_END,
    PLAYER_DEAD,
    };
    // t
    using Arguments = std::map;
    void EventProc(int event_type, Arguments& arg)
    {
    switch (event_type)
    {
    case GAME_START:
    {
    // t o
    auto a = std::any_cast(arg.at("a"));
    }

    View Slide

  10. ΊͬͪΌศརɻܕ҆શੑͱ͸ɻ
    6*ͷ֤छ෦඼Λѻ͏࣌
    break;
    default:
    break;
    }
    }
    int main()
    {
    // t ay
    std::vector> func;
    //
    func.push_back(EventProc);
    // : t v r
    auto arg = Arguments{
    { "a", -1 }, // int
    { "b", 0.5 }, // double
    };
    for (auto& f : func)
    {
    f(GAME_START, arg);
    }
    }

    View Slide

  11. ͋Γ͕ͪͳ6*ॲཧΛॻ͘ͱ͠·͢
    #include
    #include
    // UI
    struct UIBase
    {
    virtual void draw() = 0;
    virtual ~UIBase() {}
    };
    //
    struct UIBox : public UIBase
    {
    void draw()
    {
    // r
    }
    };
    struct UICircle : public UIBase
    {
    void draw()
    {
    // r
    }
    };
    int main()
    {
    // UI ay

    View Slide

  12. ͜ͷ࣍ͷεςοϓͰׂͱࠔΔ
    6*#PYͰͷαΠζࢦఆ
    6*$JSDMFͰͷ൒ܘࢦఆ
    ৭ࢦఆ
    6*ผͷॲཧ͕૿͑ͯΊΜͲ͘ͳΔɻͦ͜Ͱ* ͷग़൪
    std::vector> ui;
    ui.push_back(std::make_shared());
    ui.push_back(std::make_shared());
    // e n
    for (auto& obj : ui)
    {
    obj->draw();
    }
    }
    #include
    #include
    #include
    #include
    #include
    // UI
    using Params = std::map;

    View Slide

  13. // UI
    struct UIBase
    {
    virtual void setParams(Params& params) = 0;
    virtual void draw() = 0;
    virtual ~UIBase() {}
    };
    //
    struct UIBox : public UIBase
    {
    void setParams(Params& params)
    {
    int w = std::any_cast(params.at("width"));
    int h = std::any_cast(params.at("height"));
    }
    void draw()
    {
    // r
    }
    };
    struct UICircle : public UIBase
    {
    void setParams(Params& params)
    {
    int r = std::any_cast(params.at("radius"));
    }
    void draw()
    {
    // r
    }

    View Slide

  14. 6*ΛςΩετ͔Βߏங͢Δ࣌ʹΊͬͪΌศརɻܕ҆શੑͱ͸ɻ
    ࢀߟࢿྉ
    };
    int main()
    {
    // UI ay
    std::vector> ui;
    ui.push_back(std::make_shared());
    ui.push_back(std::make_shared());
    auto params_box = Params{
    { "width", 100 },
    { "height", 150 },
    };
    ui[0]->setParams(params_box);
    auto params_circle = Params{
    { "radius", 50 },
    };
    ui[1]->setParams(params_circle);
    // e n
    for (auto& obj : ui)
    {
    obj->draw();
    }
    }

    View Slide

  15. IUUQTKBDQQSFGFSFODFDPNXDQQVUJMJUZBOZ
    IUUQTHJUIVCDPN&[PF3ZPVDQQCPPL
    IUUQTXBOECPYPSH
    7BMJEBUF

    View Slide