Keresés

Új hozzászólás Aktív témák

  • jattila48

    aktív tag

    válasz dobragab #4087 üzenetére

    Köszi szépen a válaszodat. Először is engedd meg, hogy egy hibát javítsak:
    static RET fptr_handler(ARGS... args)
    {
    tl_function(std::forward<ARGS>(args)...);
    }

    helyesen:

    static RET fptr_handler(ARGS... args)
    {
    return tl_function(std::forward<ARGS>(args)...);
    }

    Egyébként szép megoldás a problémára.
    Lényegében hasonló, mint amit a szimulációban írtam. Ott globálisan hoztam létre az objektumokat, ezek tfv.-eit pedig free wrapper fv.-eken keresztül hívtam meg (amik a globális objektumokhoz hozzáférnek), és a free fv.-ekre mutató fv. pointert tudom aztán használni callback fv. pointerként.
    Lényegében a te megoldásod is hasonló, csak nem globális, hanem (thread_local) static std::function objecteket hozol létre (tl_function), amik tartalmazzák az objektum címét (ez a lambdában kapturált argumentum), és a megfelelő tfv. pointert. Majd ezt a tl_function std::function objectet meghívó fptr_handler statikus wrapper tfv.-nek a címét (mint közönséges pattintott C fv. pointert) adod vissza. A trükk pedig az, hogy a to_fptr function template második argumentuma egy []{} dummy lambda, aminek a típusa mindíg (fordító által generált) egyedi típus, ezért a to_fptr_t class template minden egyes alkalomkor külön-külön példányosul (a dummy lambda aktuális típusával), minden egyes function object-re külön osztályt, és azzal külön fptr_handler fv.-t létrehozva. Szép megoldás, gratula!

Új hozzászólás Aktív témák