V Londýně probíhá dvoudenní Ubuntu Summit 25.10. Na programu je řada zajímavých přednášek. Zhlédnout je lze také na YouTube (23. 10. a 24. 10.).
Gemini CLI umožňuje používání AI Gemini přímo v terminálu. Vydána byla verze 0.10.0.
Konference OpenAlt 2025 proběhne již příští víkend 1. a 2. listopadu v Brně. Nabídne přibližně 80 přednášek a workshopů rozdělených do 7 tematických tracků. Program se může ještě mírně měnit až do samotné konference, a to s ohledem na opožděné úpravy abstraktů i případné podzimní virózy. Díky partnerům je vstup na konferenci zdarma. Registrace není nutná. Vyplnění formuláře však pomůže s lepším plánováním dalších ročníků konference.
Samsung představil headset Galaxy XR se 4K Micro-OLED displeji, procesorem Snapdragon XR2+ Gen 2, 16 GB RAM, 256 GB úložištěm, operačním systémem Android XR a Gemini AI.
Před konferencí Next.js Conf 2025 bylo oznámeno vydání nové verze 16 open source frameworku Next.js (Wikipedie) pro psaní webových aplikací v Reactu. Přehled novinek v příspěvku na blogu.
Sovereign Tech Fund oznámil finanční podporu následujících open source projektů: Scala, SDCC, Let's Encrypt, Servo, chatmail, Drupal, Fedify, openprinting, PHP, Apache Arrow, OpenSSL, R Project, Open Web Docs, conda, systemd a phpseclib.
Bylo vydáno OpenBSD 7.8. S předběžnou podporou Raspberry Pi 5. Opět bez písničky.
Valkey (Wikipedie) byl vydán v nové major verzi 9.0. Valkey je fork Redisu.
Byly publikovány informace o kritické zranitelnosti v knihovně pro Rust async-tar a jejích forcích tokio-tar, krata-tokio-tar a astral-tokio-tar. Jedná se o zranitelnost CVE-2025-62518 s CVSS 8.1. Nálezci je pojmenovali TARmageddon.
AlmaLinux přinese s verzí 10.1 podporu btrfs. XFS bude stále jako výchozí filesystém, ale instalátor nabídne i btrfs. Více informací naleznete v oficiálním oznámení.
A *o
na *functor
, možná to jen nechápu...
struct { size_t a; size_t b; };
Nejspíš by se i našel způsob, jak během compile-time zjistit, jestli ten member func pointer není větší...
operator ()
, protože tam se to castuje na jiný typ, než který byl uložený, a každý může mít jinak velké member pointery.
#ifndef NDEBUG ... #endif
)
at
je hází úmyslně, neházející verze je operator []
.
GCC má debug verzi STL, která asserty obsahuje.
typeid(void(Ts...))
nebo neco podobneho.
template <typename ReturnT, typename... ParamTs> class Callback { protected: struct Iface { virtual ~Iface() {} virtual ReturnT operator ()(ParamTs... params) = 0; }; template <typename Type> struct Impl : public Iface { using Func = ReturnT (Type::*)(ParamTs...); Impl(Type &obj, Func func) : obj(obj) , func(func) {} virtual ~Impl() {} virtual ReturnT operator ()(ParamTs... params) { return std::forward<ReturnT>(obj.*func(std::forward<ParamTs...>(params))); } Type &obj; Func func; }; Iface& iface() { return *reinterpret_cast<Iface*>(buf); } size_t buf[4]; public: template <typename Type> Callback(Type &obj, typename Impl<Type>::Func func) { // Místo static_assert lze upravit, aby to použilo new static_assert(sizeof(Impl<Type>) <= sizeof(buf), "Buffer not large enough to capture callback"); new (buf) Impl<Type>(obj, func); } ~Callback() { iface().~Iface(); } ReturnT operator ()(ParamTs... params) { return std::forward<ReturnT>(iface()(std::forward<ParamTs...>(params))); } }; Callback callback(t, &Type::getValueForInput); int value = callback(input);
std::forward
na návratové hodnoty je zbytečný, navíc nebude fungovat s void
.
virtual ReturnT operator ()(ParamTs... params)
a virtual ~Impl()
v Impl
by bylo lepší označit override
.
Callback
templatová třída, pak se rovnou může použít std::function
, ne?
operator ()
) by šlo zabalit přes reinterpret_cast, protože není polymorfní (takže je to jen pointer na funkci, kde první parametr je this
), ale nebude to ověřovat typy parametrů.
Ten reinterpret_cast v původní implementaci nebude fungovat, pokud bude castovat z polymorfní třídy na nepolymorfní či obráceně, a nejspíš ani pokud bude mezi různými stromy polymorfních tříd, protože u virtuálních metod je to typicky implementováno jako index do vtable, nikoliv pointer.
class functor { protected: struct iface { virtual ~iface(){}; }; template <typename... Ts> struct args : public iface { virtual void call(Ts...) = 0; }; template <typename A, typename... Ts> struct impl : public args<Ts...> { A* obj; void (A::*func)(Ts...); impl(A* o, void (A::*f)(Ts...)) : obj(o), func(f) {} void call(Ts... args) { (obj->*func)(args...); } }; size_t i[4]; public: template<typename A, typename... Ts> functor(A* o, void (A::*f)(Ts...)) { static_assert(sizeof(impl<A, Ts...>) <= sizeof(i), "Buffer not large enough to capture callback"); new (i) impl<A, Ts...>(o,f); } template<typename... Ts> void operator()(Ts... params) { args<Ts...> *a = dynamic_cast<args<Ts...>*>(reinterpret_cast<iface*>(i)); if(a) a->call(params...); else qDebug() << "bad parameters"; } };
Tiskni
Sdílej: