Google představil telefon Pixel 10a. S funkci Satelitní SOS, která vás spojí se záchrannými složkami i v místech bez signálu Wi-Fi nebo mobilní sítě. Cena telefonu je od 13 290 Kč.
Byl publikován přehled dění a novinek z vývoje Asahi Linuxu, tj. Linuxu pro Apple Silicon. Fedora 43 Asahi Remix s KDE Plasma už funguje na M3. Zatím ale bez GPU akcelerace. Vývojáře lze podpořit na Open Collective a GitHub Sponsors.
Red Hat představil nový nástroj Digital Sovereignty Readiness Assessment (GitHub), který organizacím umožní vyhodnotit jejich aktuální schopnosti v oblasti digitální suverenity a nastavit strategii pro nezávislé a bezpečné řízení IT prostředí.
BarraCUDA je neoficiální open-source CUDA kompilátor, ale pro grafické karty AMD (CUDA je proprietární technologie společnosti NVIDIA). BarraCUDA dokáže přeložit zdrojové *.cu soubory (prakticky C/C++) přímo do strojového kódu mikroarchitektury GFX11 a vytvořit tak ELF *.hsaco binární soubory, spustitelné na grafické kartě AMD. Zdrojový kód (převážně C99) je k dispozici na GitHubu, pod licencí Apache-2.0.
Podvodné reklamy na sociálních internetových platformách, jako je Facebook, Instagram nebo X, vytvořily loni v Česku jejich provozovatelům příjmy 139 milionů eur, tedy zhruba 3,4 miliardy korun. Proti roku 2022 je to nárůst o 51 procent. Vyplývá to z analýzy Juniper Research pro společnost Revolut. Podle výzkumu je v Česku zhruba jedna ze sedmi zobrazených reklam podvodná. Je to o 14,5 procenta více, než je evropský průměr, kde je podvodná každá desátá reklama.
Desktopové prostředí KDE Plasma bylo vydáno ve verzi 6.6 (Mastodon). Přehled novinek i s videi a se snímky obrazovek v oficiálním oznámení. Podrobný přehled v seznamu změn.
Czkawka a Krokiet, grafické aplikace pro hledání duplicitních a zbytečných souborů, byly vydány ve verzi 11.0. Podrobný přehled novinek v příspěvku na Medium. Od verze 7.0 je vedle frontendu Czkawka postaveného nad frameworkem GTK 4 vyvíjen nový frontend Krokiet postavený nad frameworkem Slint. Frontend Czkawka je už pouze v udržovacím módu. Novinky jsou implementovány ve frontendu Krokiet.
Jiří Eischmann na svém blogu publikoval článek Úvod do MeshCore: "Doteď mě radioamatérské vysílání úplně míjelo. Když jsem se ale dozvěděl, že existují komunity, které svépomocí budují bezdrátové sítě, které jsou nezávislé na Internetu a do značné míry taky elektrické síti a přes které můžete komunikovat s lidmi i na druhé straně republiky, zaujalo mě to. Když o tom přede mnou pořád básnili kolegové v práci, rozhodl jsem se, že to zkusím taky.
… více »Byla vydána verze 0.5.20 open source správce počítačových her na Linuxu Lutris (Wikipedie). Přehled novinek v oznámení na GitHubu. Instalovat lze také z Flathubu.
Peter Steinberger, autor open source AI asistenta OpenClaw, nastupuje do OpenAI. OpenClaw bude převeden pod nadaci a zůstane otevřený a nezávislý.
&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: