Byla vydána (𝕏) srpnová aktualizace aneb nová verze 1.104 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a videi v poznámkách k vydání. Ve verzi 1.104 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.
Spotify spustilo přehrávání v bezztrátové kvalitě. V předplatném Spotify Premium.
Spoluzakladatel a předseda správní rady americké softwarové společnosti Oracle Larry Ellison vystřídal spoluzakladatele automobilky Tesla a dalších firem Elona Muska na postu nejbohatšího člověka světa. Hodnota Ellisonova majetku díky dnešnímu prudkému posílení ceny akcií Oraclu odpoledne vykazovala nárůst o více než 100 miliard dolarů a dosáhla 393 miliard USD (zhruba 8,2 bilionu Kč). Hodnota Muskova majetku činila zhruba 385 miliard dolarů.
Bylo vydáno Eclipse IDE 2025-09 aneb Eclipse 4.37. Představení novinek tohoto integrovaného vývojového prostředí také na YouTube.
T-Mobile od 15. září zpřístupňuje RCS (Rich Communication Services) zprávy i pro iPhone.
Společnost ARM představila platformu Arm Lumex s Arm C1 CPU Cluster a Arm Mali G1-Ultra GPU pro vlajkové chytré telefony a počítače nové generace.
Unicode Consortium, nezisková organizace koordinující rozvoj standardu Unicode, oznámila vydání Unicode 17.0. Přidáno bylo 4 803 nových znaků. Celkově jich je 159 801. Přibylo 7 nových Emoji.
Apple představil (YouTube) telefony iPhone 17 Pro a iPhone 17 Pro Max, iPhone 17 a iPhone Air, sluchátka AirPods Pro 3 a hodinky Watch Series 11, Watch SE 3 a Watch Ultra 3.
Realtimová strategie Warzone 2100 (Wikipedie) byla vydána ve verzi 4.6.0. Podrobný přehled novinek, změn a oprav v ChangeLogu na GitHubu. Nejnovější verzi Warzone 2100 lze již instalovat také ze Snapcraftu a Flathubu.
Polské vývojářské studio CD Projekt Red publikovalo na Printables.com 3D modely z počítačové hry Cyberpunk 2077.
&trida::metoda
.
Dohledal jsem mnoho implementací "delegation/c++ method callback" z různých dob na různých verzích C++.
Rád bych se zeptat, jak dnes, tady a teď řešit tuto problematiku.
Díky
Jak známo, pokud nebudu používat statické metody, není možné použít &trida::metoda.
Huh? A tohle je "známo" odkdy? Že jsem to nějak nepostřehnul… Tady jsou "nestatické" metody a &třída::metoda
:
#include <iostream> #include <memory> #include <string> #include <tuple> class BunchOfCallbacks { public: BunchOfCallbacks(std::string state) : state_(std::move(state)) {} void Callback1(const std::string& message) const { std::cout << "Callback1 (" << state_ << "): " << message << std::endl; } void Callback2(const std::string& message) const { std::cout << "Callback2 (" << state_ << "): " << message << std::endl; } private: const std::string state_; }; int main() { const std::tuple<BunchOfCallbacks, void (BunchOfCallbacks::*)(const std::string&) const> callbacks[]{ {BunchOfCallbacks{"first state"}, &BunchOfCallbacks::Callback1}, {BunchOfCallbacks{"second state"}, &BunchOfCallbacks::Callback2}, }; for (const auto& bunch_callback : callbacks) { const auto& bunch{std::get<0>(bunch_callback)}; const auto callback{std::get<1>(bunch_callback)}; (bunch.*callback)("Yay! I can select a callback!"); } }
Bývá problém to předat do API nějaké céčkovské knihovny, ne?
Tam to často řeší tak, že kromě (statické) funkce lze předat i libovolný ukazatel, který se pak použije jako parametr při volání té funkce (tzn. tohle je způsob jak tam dostat to this
nebo nějaký kontext)
Máš pravdu, (implicitní) požadavek na interoperabilitu s C jsem tady úplně přehlédl. Ano, tam by se to muselo řešit jinak.
Problém totiž je, že member pointer je dost podivná věc. Například sizeof(void (BunchOfCallbacks::*)(const std::string&))
je asi tak 16, což zjevně neodpovídá pointeru, se kterým by mohlo pracovat přímo C.
(Důvod pro velikost member pointeru nějak souvisí s tím, že skrz něj musí správně fungovat taky virtuální metody. Což je u tříd bez virtuálních metod celkem jedno, ale ta implementace už je zkrátka taková.)
Když to má spolupracovat s C, asi bych ten callback napsal jako virtuální metodu, tj. každý typ callbacku by byl třída. Tam se pak dá předat tomu C nějaký void*
a vhodný C++ wrapper (viditelný z C) ho může interpretovat jako ukazatel na toho abstraktního předka a zavolat jeho virtuální metodu.
Inu, epoll()
neznám, takže příklad s epoll()
tady narychlo nesesmolím, ale takhle by mohla (obecně) vypadat ta spolupráce s C (tady konkrétně s pthread
):
#include <errno.h> #include <pthread.h> #include <string.h> #include <iostream> namespace { struct Callback { virtual void* call() = 0; }; class ThreadWrapper { pthread_t thread_; public: ThreadWrapper(void* (*start_routine)(void*), void* arg) { if (-1 == pthread_create(&thread_, nullptr, start_routine, arg)) { throw errno; } } ~ThreadWrapper() { if (-1 == pthread_join(thread_, nullptr)) { std::cerr << "Join failed!\n"; } } }; void* ThreadBody(void* arg) { return static_cast<Callback*>(arg)->call(); } } // namespace int main() { struct Callback1 : public Callback { void* call() override { std::cout << "I'm Callback 1!\n"; return nullptr; } } callback1; struct Callback2 : public Callback { void* call() override { std::cout << "I'm Callback 2!\n"; return nullptr; } } callback2; try { ThreadWrapper t1(ThreadBody, &callback1); ThreadWrapper t2(ThreadBody, &callback2); } catch (int e) { std::cerr << strerror(e) << std::endl; } }
To^^^ pochopitelně vyžaduje -lpthread
.
(Jasně, používat takhle v C++ pthread
je nesmysl, protože C++ má už dávno (od dob Rapperswilu) na vlákna vhodnější abstrakce, nicméně tohle je míněno jako příklad na "callback mezi C a C++".)
Tiskni
Sdílej: