/ / Šablóna triedy na zatvorenie HANDLES a ďalších WINAPI? - c ++, trieda, šablóny, popisovač

Trieda šablón na zatvorenie HANDLES a ostatných WINAPI? - c ++, trieda, šablóny, zvládnuť

Som nováčikom v C ++ a potrebujem pomoc.

Chcem vytvoriť šablónu class/struct že rukoväte HANDLE a ďalšie WINAPIs zatiaľ je tento kód:

template <typename type_to_open, typename returntype, returntype (WINAPI * GlobalFn)(
type_to_open )> class Handle_Wrap {
public:
type_to_open data;
Handle_Wrap (type_to_open in_data) { data = in_data; }
~Handle_Wrap() { returntype (WINAPI * GlobalFn)( type_to_open );}
};

Handle_Wrap <HANDLE, BOOL, ::FindClose> hFind ( FindFirstFileA (pattern.c_str(), &ffd) );

Úprimne si nemyslím, že jeho fungovanie a kompilátor mi dávajú varovanie:

warning C4101: "GlobalFn" : unreferenced local variable

Videl som tento kód z webu a vykonal som v ňom určité zmeny. Neviem, či je to správny spôsob, ako to urobiť?

odpovede:

1 pre odpoveď č. 1

Problém je vo vašom deštruktore. Vyhlásenie zopakujete z GlobalFn, skôr ako to nazvať. To by malo byť:

~HandleWrap() { (*GlobalFn)( data ); }

Tiež by ste chceli, aby táto trieda bola kopírovateľná,hnuteľné alebo ani jedno? Ak ani jeden, mali by ste podniknúť kroky na zabránenie niektorému z nich príslušné predvolené hodnoty generované kompilátorom; inak budete potrebovať poskytnúť zodpovedajúce konštruktory (a prípadne i operátorov priradenia). Ak je možné kopírovať, budete tiež potrebovať nejaký druh počítadla, zdieľané medzi všetkými kópiami, takže iba posledný deštruktor uvoľní rukoväť. Pre pohyblivé (pravdepodobne najlepšie riešenie, ak môžete si byť istí, že máte C ++ 11), potrebujú pohyb konštruktor, ktorý robí niečo, aby zabezpečili, že deštruktor presunutého z objektu je ne-op.


0 pre odpoveď č. 2

Ako sa používa štandard unique_ptr

 std::unique_ptr<HANDLE, ::FindClose> hFind = FindFirstFileA(...);

(Alebo niečo podobné).

Mám podozrenie, že vo vašom kóde je problém, že kompilátor ho nevidí GlobalFn ako volanie funkcie, ale ako protoptyp (ďalšie „víťazstvo“ pre Most Vexing Parse) - nemali by ste ich používať WINAPI vôbec to urobte z ukazovateľa funkčných šablón:

trieda šablón Handle_Wrap { ... ~ Handle_Wrap () {GlobalFn (data); } };

Pravdepodobne budete tiež chcieť použiť add operator type_to_open() { return data; }, aby ste mohli používať FindNextFile(hFind, ...), namiesto toho, aby ste sa museli spoľahnúť data byť verejný.