Byla vydána nová verze 3.38 frameworku Flutter (Wikipedie) pro vývoj mobilních, webových i desktopových aplikací a nová verze 3.10 souvisejícího programovacího jazyka Dart (Wikipedie).
Organizace Apache Software Foundation (ASF) vydala verzi 28 integrovaného vývojového prostředí a vývojové platformy napsané v Javě NetBeans (Wikipedie). Přehled novinek na GitHubu. Instalovat lze také ze Snapcraftu a Flathubu.
Byl vydán Debian 13.2, tj. druhá opravná verze Debianu 13 s kódovým názvem Trixie. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Instalační média Debianu 13 lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.
Google představil platformu Code Wiki pro rychlejší porozumění existujícímu kódu. Code Wiki pomocí AI Gemini udržuje průběžně aktualizovanou strukturovanou wiki pro softwarové repozitáře. Zatím jenom pro veřejné. V plánu je rozšíření Gemini CLI také pro soukromé a interní repozitáře.
V přihlašovací obrazovce LightDM KDE (lightdm-kde-greeter) byla nalezena a již opravena eskalace práv (CVE-2025-62876). Detaily v příspěvku na blogu SUSE Security.
Byla vydána nová verze 7.2 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Tor Browser byl povýšen na verzi 15.0.1. Další novinky v příslušném seznamu.
Česká národní banka (ČNB) nakoupila digitální aktiva založená na blockchainu za milion dolarů (20,9 milionu korun). Na vytvořeném testovacím portfoliu, jehož součástí jsou bitcoin, stablecoiny navázané na dolar a tokenizované depozitum, chce získat praktickou zkušenost s držením digitálních aktiv. Portfolio nebude součástí devizových rezerv, uvedla dnes ČNB v tiskové zprávě.
Apple představil iPhone Pocket pro stylové přenášení iPhonu. iPhone Pocket vzešel ze spolupráce značky ISSEY MIYAKE a Applu a jeho tělo tvoří jednolitý 3D úplet, který uschová všechny modely iPhonu. iPhone Pocket s krátkým popruhem se prodává za 149,95 dolarů (USA) a s dlouhým popruhem za 229,95 dolarů (USA).
Byla vydána nová stabilní verze 7.7 webového prohlížeče Vivaldi (Wikipedie). Postavena je na Chromiu 142. Přehled novinek i s náhledy v příspěvku na blogu.
Společnost Epic Games vydala verzi 5.7 svého proprietárního multiplatformního herního enginu Unreal Engine (Wikipedie). Podrobný přehled novinek v poznámkách k vydání.
std::function<void (EraseResult)> OnEraseDone;
std::thread eraseDisc(bool quick, OnEraseDone callback)
{
std::thread th(std::bind(&Device::_eraseThread, this, callback));
return std::move(th);
}
void _eraseThread(OnEraseDone callback)
{
// blabla
}
Callbacky mi tak hezky fungovaly, ale jen do té doby, než jsem místo obyčejné funkce jako callback chtěl použít pointer na metodu:
// v metodě objektu typu Test std::thread th = eraseDisc(true, OnEraseDone(&Test::eraseDone, this));Kompilátor nahlásí slušnou 100 řádkovou chybu, ze které se zdá, že takový konstruktor std::function nemá a std::bind mi taky nepomůže. Otázkou tedy je, co použít místo std::function (GCC 4.4 ještě neumí lambda funkce, tak ty taky ne, boost knihovnu taky nee), nebo poradit, co dělám špatně.
Řešení dotazu:
std::mem_fn, Jardiku!
bind (nějak takhle):
eraseDisc(true, boost::bind(&Objekt::metoda, this));
Skoro jistě (nechce se mi to zjišťovat) je to v C++0x taky (asi se to bude jmenovat std::bind), najdi si to.
Nebo můžeš bejt frikulín, a jít do lambdy (bez záruky jak na syntax, tak na funkčnost v nějakým kompilátoru):
eraseDisc(true, []{ this->metoda(); } );
Na std::function je konvertovatelný buď func-pointer, nebo funktor.
Tahleta dnesni mladez ...
std::bind(std::mem_fn(&Test::eraseDone), this)
std::function<void (EraseResult)>
Jo aha, vy tam mate jeste jeden volnej parametr... s vama je teda prace!
#include <functional>
#include <string>
#include <iostream>
struct test
{
void run(const std::string& message)
{
std::cout << message << "\n";
}
};
int main(int argc, char** argv)
{
using namespace std::placeholders;
test t;
std::function<void (const std::string&)> f = std::bind(&test::run, &t, _1);
f("Hola hola");
}
(Mate recht, jde to i bez std::mem_fn, musim se podivat, proc mne to bez nej kdysi neslo...)
std::bind(&Test::eraseDone, this, std::placeholders::_1)
Děkuju.
Kompilator musi pripravit kod, kterej za behu rozhodne jestli je metoda virtualni nebo ne, jestli nahodou neni zdedena od virtualniho predka a pod.Nikoliv, kompilátor nic takového dělat nemusí. Ani nemůže, protože za běhu v programu taková informace prostě není (ledaže by si ji tam ten implementátor speciálně kvůli tomuhle přidal, ale v takovém případě je pochybné mluvit o tom jako o opruzu - implementátor si za ten opruz může sám, a to i v případě, kdy chce dodržet nějaké ABI). Pokud jde o ukazatele na metodu, je situace celkem jednoduchá - asi nejjednodušší implementace je dvojice
(pointer na funkci, offset pro this) s tím, že pro volání virtuální funkce ap. kompilátor vygeneruje kód
Ret synthesized_thunk(T* that, Args... args) {
that->real_function(args);
}
a tuhle funkci použije do toho PMF.
zabira member pointer 6-12B na 32bit platformachTo není vůbec k divení, takových věcí je víc.
Je to jedna z nejtezsich veci pro impementatory C++ kompilatoruImplementoval ten váš expert RTTI? Výjimky? Linker? To jsou všechno věci těžší, anebo pracnější, a zcela určitě jejich datové struktury zabírají víc, než pouhých 12 B.
Ja jsem si z toho vzal ponauceni ze nikdy member pointer pouzivat nebuduUniká mi logika tohohle kroku. I když to nebudete používat, implementovat se to bude pořád stejně (těžce nebo lehce, to je jedno).
ze mi staci trida command s metorou run.... čímž se ochudíte o jakýkoli generický kód, který spolupracuje s funktory. Disclaimer: Tento příspěvek rozhodně nemá vyvolat dojem, že PMF by se měly používat nějak masově. IMHO jsou PMF v C++ jedním z reliktů C (v tomto případě ukazatelů na funkce) a jejich použití přináší např. výkonnostní problémy, na druhou stranu není jednoduché a nepodporuje znovupoužitelnost kódu.
Tiskni
Sdílej: