Open source reimplementace počítačových her Tomb Raider I a Tomb Raider II spolu s dalšími vylepšeními a opravami chyb TRX byla vydána ve verzi 1.0. Jedná se o sloučení projektů / enginů TR1X a TR2X do jednoho TRX. Videoukázka na YouTube.
Společnost Seznam.cz spouští konverzační nástroj založený na umělé inteligenci Seznam Asistent. Asistent využívá vlastní jazykový model SeLLMa a dočasně i komerční modely od OpenAI provozované v evropských datacentrech prostřednictvím Microsoft Azure. Dlouhodobým cílem Seznamu je provozovat Asistenta výhradně na interních jazykových modelech a ve vlastních datových centrech.
Software LibrePods osvobozuje bezdrátová sluchátka AirPods z ekosystému Applu. Exkluzivní funkce AirPods umožňuje využívat na Androidu a Linuxu. Díky zdokumentování proprietárního protokolu AAP (Apple Accessory Protocol).
Byl vydán AlmaLinux OS 10.1 s kódovým názvem Heliotrope Lion. S podporou Btrfs. Podrobnosti v poznámkách k vydání.
Placená služba prohledávání zprostředkovatelů dat a automatického odstraňování uniklých osobních údajů Mozilla Monitor Plus bude 17. prosince ukončena. Bezplatná monitorovací služba Mozilla Monitor bude i nadále poskytovat okamžitá upozornění a podrobné pokyny k omezení rizik úniku dat. Služba Mozilla Monitor Plus byla představena v únoru loňského roku.
Waydroid (Wikipedie, GitHub) byl vydán v nové verzi 1.6.0. Waydroid umožňuje spouštět aplikace pro Android na běžných linuxových distribucích. Běhové prostředí vychází z LineageOS.
Příspěvek na blogu Raspberry Pi představuje novou kompletně přepracovanou verzi 2.0 aplikace Raspberry Pi Imager (YouTube) pro stažení, nakonfigurování a zapsání obrazu operačního systému pro Raspberry Pi na SD kartu. Z novinek lze vypíchnout volitelnou konfiguraci Raspberry Pi Connect.
Memtest86+ (Wikipedie), svobodný nástroj pro kontrolu operační paměti, byl vydán ve verzi 8.00. Přináší podporu nejnovějších procesorů Intel a AMD nebo také tmavý režim.
Programovací jazyk Racket (Wikipedie), tj. jazyk z rodiny jazyků Lisp a potomek jazyka Scheme, byl vydán v nové major verzi 9.0. Hlavní novinku jsou paralelní vlákna (Parallel Threads).
Před šesti týdny bylo oznámeno, že Qualcomm kupuje Arduino. Minulý týden byly na stránkách Arduina aktualizovány podmínky používání a zásady ochrany osobních údajů. Objevily se obavy, že by otevřená povaha Arduina mohla být ohrožena. Arduino ubezpečuje, že se nic nemění a například omezení reverzního inženýrství v podmínkách používání se týká pouze SaaS cloudové aplikace.
&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: