Аз съм нов в 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
са публични.