/ / Клас на шаблони, за да затворите РЪЧЕТЕ и други WINAPI? - c ++, class, templates, handle

Клас на шаблони за затваряне на HANDLES и други WINAPI's? - C ++, клас, шаблони, дръжка

Аз съм нов в C ++ и се нуждая от помощ.

Искам да направя шаблон class/struct който се справя HANDLE и други WINAPIДосега този код е:

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

Честно казано, не мисля, че работата и компилаторът ми дава предупреждение:

warning C4101: "GlobalFn" : unreferenced local variable

Видях този код от мрежата и направих някои промени в него и не знам дали това е правилният начин да го направя?

Отговори:

1 за отговор № 1

Проблемът е във вашия деструктор. Повтаряте декларацията на GlobalFn, вместо да я наричате. Трябва да бъде:

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

Също така, искате ли да направите този клас за копиране,подвижни или нито едно? Ако не е така, трябва да предприемете стъпки за предотвратяване на някой от съответните компилатор генерира по подразбиране; в противен случай ще трябва да предоставят съответните конструктори (и евентуално оператори). Ако може да се копира, ще се нуждаете от някакъв вид на брояч, споделени между всички копия, така че само последният деструктор освобождава дръжката. За подвижни (вероятно. \ T най-доброто решение, ако можете да сте сигурни, че имате C ++ 11), вие ще "ll." нужда от конструктор на движение, който прави нещо, за да се гарантира, че деструкторът на преместения от обекта е no-op.


0 за отговор № 2

Какво ще кажете за използването на стандарта unique_ptr

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

(Или нещо такова).

Подозирам, че проблемът в кода е, че компилаторът не вижда GlobalFn като функционално повикване, но като протоптип (друга "победа" за Most Vexing Parse) - не трябва да използвате WINAPI изобщо, направете го с нагласена функция:

шаблонен клас Handle_Wrap { ... ~ Handle_Wrap () {GlobalFn (данни); } };

Вие вероятно ще искате да използвате add operator type_to_open() { return data; }, така че да можете да използвате FindNextFile(hFind, ...), вместо да се налага да разчитате data са публични.