abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
včera 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 1
včera 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 5
včera 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 0
včera 12:55 | Nová verze

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 4
včera 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 0
včera 00:10 | Nová verze

Byla vydána verze 3.2 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata. Z novinek lze zmínit například podporu protokolů DNP3 a CIP/ENIP, vylepšenou podporu TLS a samozřejmě také aktualizovanou dokumentaci.

Ladislav Hagara | Komentářů: 0
1.12. 21:00 | Nová verze

Byla vydána beta verze Linux Mintu 18.1 s kódovým jménem Serena. Na blogu Linux Mintu jsou hned dvě oznámení. První o vydání Linux Mintu s prostředím MATE a druhé o vydání Linux Mintu s prostředím Cinnamon. Stejným způsobem jsou rozděleny také poznámky k vydání (MATE, Cinnamon) a přehled novinek s náhledy (MATE, Cinnamon). Linux Mint 18.1 bude podporován až do roku 2021.

Ladislav Hagara | Komentářů: 0
1.12. 16:42 | Nová verze

Byl vydán Devuan Jessie 1.0 Beta 2. Jedná se o druhou beta verzi forku Debianu bez systemd představeného v listopadu 2014 (zprávička). První beta verze byla vydána v dubnu letošního roku (zprávička). Jedna z posledních přednášek věnovaných Devuanu proběhla v listopadu na konferenci FSCONS 2016 (YouTube, pdf).

Ladislav Hagara | Komentářů: 0
1.12. 15:16 | Komunita

Na GOG.com začal zimní výprodej. Řada zlevněných her běží oficiálně také na Linuxu. Hru Neverwinter Nights Diamond lze dva dny získat zdarma. Hra dle stránek GOG.com na Linuxu neběží. Pomocí návodu ji lze ale rozběhnout také na Linuxu [Gaming On Linux].

Ladislav Hagara | Komentářů: 1
1.12. 13:14 | Bezpečnostní upozornění

Byla vydána verze 2.7.1 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Řešeno je několik bezpečnostních problémů. Aktualizován byl především Tor Browser na verzi 6.0.7. Tor Browser je postaven na Firefoxu ESR (Extended Support Release) a právě ve Firefoxu byla nalezena a opravena vážná bezpečnostní chyba MFSA 2016-92 (CVE-2016-9079, Firefox SVG Animation

… více »
Ladislav Hagara | Komentářů: 0
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 759 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: c++0x, std::function

Jardík avatar 15.2.2010 19:41 Jardík | skóre: 40 | blog: jarda_bloguje
c++0x, std::function
Přečteno: 415×
Stala se mi taková věc. Něco jsem programoval a použil jsem tam callbacky ve stylu
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ě.
Věřím v jednoho Boha.

Řešení dotazu:


Odpovědi

15.2.2010 20:51 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: c++0x, std::function
Use the std::mem_fn, Jardiku!
Jardík avatar 15.2.2010 21:29 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: c++0x, std::function
Takováto odpověď mi nestačí. mem_fn jenom obsáhne ten pointer na metodu, ale né objekt, na který se to má volat a je třeba ho poté uvést, což není to, co potřebuju.
Věřím v jednoho Boha.
15.2.2010 21:40 Jirka P
Rozbalit Rozbalit vše Re: c++0x, std::function
To, co potřebuješ, je 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.
Jardík avatar 15.2.2010 22:23 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: c++0x, std::function
V dotazu jsem snad psal, že GCC lambdy zatím nemá (je sice SVN branch, který je má, ale extra kompilovat gcc se mi moc nechce).
Věřím v jednoho Boha.
15.2.2010 21:44 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: c++0x, std::function

Tahleta dnesni mladez ...

std::bind(std::mem_fn(&Test::eraseDone), this)
Jardík avatar 15.2.2010 22:30 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: c++0x, std::function
Tak na tohle mem_fn() nepotřebuju, to zvládne bind() i bez toho. Problém však je, že výsledek nemůžu přiřadit do std::function<void (EraseResult)>
Věřím v jednoho Boha.
15.2.2010 22:46 Sinuhet | skóre: 31
Rozbalit Rozbalit vše Re: c++0x, std::function

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...)

15.2.2010 22:46 Jirka P
Rozbalit Rozbalit vše Re: c++0x, std::function
Jestli to má mít ještě parametry, tak:

std::bind(&Test::eraseDone, this, std::placeholders::_1)
Jardík avatar 15.2.2010 22:57 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: c++0x, std::function
To je ono :-) Děkuju.
Věřím v jednoho Boha.
16.2.2010 10:57 Ivan
Rozbalit Rozbalit vše OT: was Re: c++0x, std::function
Koukam ze uz jsi to vyresil. Stejne si ale neodpustim jednu OT poznamku, kterou si jeste pamatuju jeste ze skoly. Nas prednasejici se jednou rozpovidal na tema jakej straslivej opruz byl implementovat member pointery v jeho kompilatoru. Kompilator musi pripravit kod, kterej za behu rozhodne jestli je metoda virtualni nebo ne, jestli nahodou neni zdedena od virtualniho predka a pod. Te to prej desna magie a v zavislosti na implementaci zabira member pointer 6-12B na 32bit platformach. Je to jedna z nejtezsich veci pro impementatory C++ kompilatoru. Ja jsem si z toho vzal ponauceni ze nikdy member pointer pouzivat nebudu, ze mi staci trida command s metorou run.
16.2.2010 13:28 Jirka P
Rozbalit Rozbalit vše Re: OT: was Re: c++0x, std::function
Upřímně řečeno, z takovéhle logiky se mi otvírá kudla v kapse. Když to převyprávím, tak prostě nějaký přednášející něco implementoval, nešlo mu to, tak to prohlásil za opruz, a učí to studenty nepoužívat.

K jednotlivým bodům:
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 platformach
To není vůbec k divení, takových věcí je víc.
Je to jedna z nejtezsich veci pro impementatory C++ kompilatoru
Implementoval 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 nebudu
Uniká 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.
16.2.2010 13:54 dark
Rozbalit Rozbalit vše Re: OT: was Re: c++0x, std::function
A co toto, celkem jednoduché a fungovalo mi to zatím všude:)

Member Function Pointers and the Fastest Possible C++ Delegates
Jardík avatar 17.2.2010 22:34 Jardík | skóre: 40 | blog: jarda_bloguje
Rozbalit Rozbalit vše Re: OT: was Re: c++0x, std::function
O tom já přece vím, ale já chtěl c++0x řešení :-)
Věřím v jednoho Boha.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.