121
Vývoj / C++ Bindovanie funkcií, std::funnction a pointery na funkciu
« kdy: 26. 09. 2020, 16:03:02 »
Dobrý deň nedávno som tu založil túto tému: https://forum.root.cz/index.php?topic=23520.0
V skratke do funkcie, ktorá vyžaduje ako parameter pointer na funkciu, s jediným parametrom by som potreboval pridať ďalší parameter. (pozn: Keďže v C++ sa currying nedá použiť (nie tak ako inde) lebo lambda s captures je typovo nekompatibilná s lambdou bez captures takže postupy, ktoré poznám z funkcionálnych jazykov som nemohol použiť)
Spomínali ste, že sa mám pozrieť na type erasure. Niekto tam pridal príklad s constexpr ktorý síce fungoval ale len s primitívnymi typmi. A keď som chcel ten primitívny typ nahradiť objektom tak compiler protestoval.
Hral som sa aj s tými type erasures, ale nejako mi to nefungovalo.V čistom C som nikdy neprogramoval a v C++ som začiatočník venujem sa mu občas s niekoľko mesačnými prestávkami. Takže Cčkovský pointer na funkciu je pre mňa niečo nové. C++ má typ std::function s ktorým mi všetko bez problémov funguje (kôli vačšej prehľadnosti kódu som to hodil na pastebin):
https://pastebin.com/zEY0H7Ay - verzia std::function mi funguje.
Lenže ja mám windows api funkciu ktorá ako parameter nepýta std::function z C++ ale pointer na funkciu. To znamená že som použil typ std::function naň som aplikoval std::bind pridal som parameter. A potom som sa snažil to prekonvertovať na Cčkový pointer na funkciu:
https://pastebin.com/5icv1F7b - verzia s konverziou na pointer na funkciu mi nefunguje. Skompilovať ide ale potom mi to hodí runtime error:
Exception thrown at 0x0000000000000000 in Erasure.exe: 0xC0000005: Access violation executing location 0x0000000000000000. Niečo tam mám evidentne zle ale ani za svet nedokážem prísť na to že čo.
Viete mi prosím poradiť ako nabindovaný std::function<int(int)> prekonvertovať na int(*)(int item)?
PS: Tá funkcia map je len príklad... Samoztejme viem že C++ má std::transform používajúce iterátory. Mne išlo len o ukážku kódu. V mojom projekte riešim niečo iné, ale súvisí to tiež s bindovaním funkcií. Akurát tam nechcem nabindovať premennú primitívneho typu, ale objekt.
V skratke do funkcie, ktorá vyžaduje ako parameter pointer na funkciu, s jediným parametrom by som potreboval pridať ďalší parameter. (pozn: Keďže v C++ sa currying nedá použiť (nie tak ako inde) lebo lambda s captures je typovo nekompatibilná s lambdou bez captures takže postupy, ktoré poznám z funkcionálnych jazykov som nemohol použiť)
Spomínali ste, že sa mám pozrieť na type erasure. Niekto tam pridal príklad s constexpr ktorý síce fungoval ale len s primitívnymi typmi. A keď som chcel ten primitívny typ nahradiť objektom tak compiler protestoval.
Hral som sa aj s tými type erasures, ale nejako mi to nefungovalo.V čistom C som nikdy neprogramoval a v C++ som začiatočník venujem sa mu občas s niekoľko mesačnými prestávkami. Takže Cčkovský pointer na funkciu je pre mňa niečo nové. C++ má typ std::function s ktorým mi všetko bez problémov funguje (kôli vačšej prehľadnosti kódu som to hodil na pastebin):
https://pastebin.com/zEY0H7Ay - verzia std::function mi funguje.
Lenže ja mám windows api funkciu ktorá ako parameter nepýta std::function z C++ ale pointer na funkciu. To znamená že som použil typ std::function naň som aplikoval std::bind pridal som parameter. A potom som sa snažil to prekonvertovať na Cčkový pointer na funkciu:
https://pastebin.com/5icv1F7b - verzia s konverziou na pointer na funkciu mi nefunguje. Skompilovať ide ale potom mi to hodí runtime error:
Exception thrown at 0x0000000000000000 in Erasure.exe: 0xC0000005: Access violation executing location 0x0000000000000000. Niečo tam mám evidentne zle ale ani za svet nedokážem prísť na to že čo.
Viete mi prosím poradiť ako nabindovaný std::function<int(int)> prekonvertovať na int(*)(int item)?
PS: Tá funkcia map je len príklad... Samoztejme viem že C++ má std::transform používajúce iterátory. Mne išlo len o ukážku kódu. V mojom projekte riešim niečo iné, ale súvisí to tiež s bindovaním funkcií. Akurát tam nechcem nabindovať premennú primitívneho typu, ale objekt.