Na čem pracují vývojáři webového prohlížeče Ladybird (GitHub)? Byl publikován přehled vývoje za září (YouTube).
Vyšla kniha Počítačové programy a autorské právo. Podle internetových stránek nakladatelství je v knize "Významný prostor věnován otevřenému a svobodnému softwaru, jeho licencím, důsledkům jejich porušení a rizikům „nakažení“ proprietárního kódu režimem open source."
Red Hat řeší bezpečnostní incident, při kterém došlo k neoprávněnému přístupu do GitLab instance používané svým konzultačním týmem.
Immich byl vydán v první stabilní verzi 2.0.0 (YouTube). Jedná se o alternativu k výchozím aplikacím od Googlu a Applu pro správu fotografií a videí umožňující vlastní hosting serveru Immich. K vyzkoušení je demo. Immich je součástí balíčků open source aplikací FUTO. Zdrojové kódy jsou k dispozici na GitHubu pod licencí AGPL-3.0.
Český telekomunikační úřad vydal zprávy o vývoji cen a trhu elektronických komunikací se zaměřením na rok 2024. Jaká jsou hlavní zjištění? V roce 2024 bylo v ČR v rámci služeb přístupu k internetu v pevném místě přeneseno v průměru téměř 366 GB dat na jednu aktivní přípojku měsíčně – celkově jich tak uživateli bylo přeneseno přes 18 EB (Exabyte). Nejvyužívanějším způsobem přístupu k internetu v pevném místě zůstal v roce 2024 bezdrátový
… více »Raspberry Pi OS, oficiální operační systém pro Raspberry Pi, byl vydán v nové verzi 2025-10-01. Přehled novinek v příspěvku na blogu Raspberry Pi a poznámkách k vydání. Jedná o první verzi postavenou na Debianu 13 Trixie.
Byla vydána nová verze 4.6 svobodného notačního programu MuseScore Studio (Wikipedie). Představení novinek v oznámení v diskusním fóru a také na YouTube.
Společnost DuckDuckGo stojící za stejnojmenným vyhledávačem věnovala 1,1 milionu dolarů (stejně jako loni) na podporu digitálních práv, online soukromí a lepšího internetového ekosystému. Rozdělila je mezi 29 organizací a projektů. Za 15 let rozdala 8 050 000 dolarů.
Svobodný multiplatformní herní engine Bevy napsaný v Rustu byl vydán ve verzi 0.17. Díky 278 přispěvatelům.
Bylo vydáno openSUSE Leap 16 (cs). Ve výchozím nastavení přichází s vypnutou 32bitovou (ia32) podporou. Uživatelům však poskytuje možnost ji ručně povolit a užívat si tak hraní her ve Steamu, který stále závisí na 32bitových knihovnách. Změnily se požadavky na hardware. Leap 16 nyní vyžaduje jako minimální úroveň architektury procesoru x86-64-v2, což obecně znamená procesory zakoupené v roce 2008 nebo později. Uživatelé se starším hardwarem mohou migrovat na Slowroll nebo Tumbleweed.
&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: