Не уверен, что удачно сформулировал заголовок, но задача у меня следующая.
Я пытаюсь создать свой auto_ptr.
Сделал такой шаблон класса:
// auto pointer/auto handle class.
// automatically destroys pointer/closes handle when object destroyed.template<typename PTR, void DESTROY_FUNC(PTR)>
class my_auto_ptr
{
// реализация
};
// короткие названия для часто используемых типовtypedef my_auto_ptr<HANDLE, destroy_handle> auto_handle;
// destroy_handle() в данном примере определена отдельно:inline void destroy_handle(HANDLE ptr)
{
CloseHandle(ptr);
}
В моём проекте/подпроектах память может выделяться двумя разными способами:
либо malloc() из стандартной библиотеки,
либо HeapAlloc(GetProcessHeap(), ...) из Win32 API.
Я создал соответственно две функции для освобождения памяти:
Я же хочу задать короткие имена, что-нибудь в таком роде:
// здесь компилятор заслуженно ругается на PTR -- дескать не знаю, что это.typedef my_auto_ptr<PTR, destroy_free_ptr> auto_free_ptr<PTR>;
typedef my_auto_ptr<PTR, destroy_heap_ptr> auto_heap_ptr<PTR>;
Как это можно сделать?
Re: псевдоним template класса с незаданным параметром?
Здравствуйте, Alexander G, Вы писали:
W>>Врядли. У умного указателя наверняка имеются кастомные конструкторы и операторы присваивания. AG>Конструкторы, кроме копирования — зафорвардить вручную, оператор = сам сгенерится. AG>Конечно, для смартпоинтера это плохой вариант, но луше не знаю
Ну можно, например, поступить так, как тут уже советовали, но постараться обойтись без слова type.
Так, чтобы писалось как-то так:
auto_free<T>::ptr, auto_heap<T>::ptr
а можно ещё макросы завести AUTO_FREE_PTR(PTR) и AUTO_HEAP_PTR(PTR)
только как-то не понятно на кой это всё надо? Может быть каким-то уже готовым смартпоинтером стоит попользоваться? Там много прикольного уже люди напридумывали, вообще-то...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[2]: псевдоним template класса с незаданным параметром?
W>>>Врядли. У умного указателя наверняка имеются кастомные конструкторы и операторы присваивания. AG>>Конструкторы, кроме копирования — зафорвардить вручную, оператор = сам сгенерится. AG>>Конечно, для смартпоинтера это плохой вариант, но луше не знаю
Спасибо за ответы.
Как временное решение я так и сделал: создал класс-наследник и прописал в нём все конструкторы (их у меня пока два). Но чем больше приходится писать, тем больше ошибок можно посадить. И поддерживать сложнее, если понадобится добавить новый конструктор.
Понравилось решение от Were и byleas с объявлением типа в новом шаблоне. Сегодня поменяю код
E>только как-то не понятно на кой это всё надо? Может быть каким-то уже готовым смартпоинтером стоит попользоваться? Там много прикольного уже люди напридумывали, вообще-то...
Можете что-то посоветовать, что уже сами опробовали и понравилось?
Мой смартпоинтер умеет не только освобождать память, но и закрывать handle различных типов (мой проект активно использует Win32 API).
Re[6]: псевдоним template класса с незаданным параметром?
Здравствуйте, Василий Зверев, Вы писали:
ВЗ>Можете что-то посоветовать, что уже сами опробовали и понравилось? ВЗ>Мой смартпоинтер умеет не только освобождать память, но и закрывать handle различных типов (мой проект активно использует Win32 API).
Re: псевдоним template класса с незаданным параметром?
От:
Аноним
Дата:
04.12.08 10:50
Оценка:
Нет.
В новом стандарте это, может быть, и введут, но кому он нужен этот новый стандарт? К тому времени, когда все компиляторы будут его поддерживать, уже сам C++ умрет.
Re[6]: псевдоним template класса с незаданным параметром?
Здравствуйте, Василий Зверев, Вы писали:
ВЗ>Мой смартпоинтер умеет не только освобождать память, но и закрывать handle различных типов (мой проект активно использует Win32 API).
А какие библиотеки доступны?
Просто auto_ptr он как идея не того, не очень хорош...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[6]: псевдоним template класса с незаданным параметром?
Здравствуйте, Василий Зверев, Вы писали:
... ВЗ>Мой смартпоинтер умеет не только освобождать память, но и закрывать handle различных типов (мой проект активно использует Win32 API).
А так умеет ?
void foo(auto_free_ptr<PTR>);
//...
auto_heap_ptr<PTR> p = ...;
foo(p);
Это я к тому что политика освобождения является частью типа(иногда это надо, зачастую — нет). Функции оперирующей с указателем обычно все равно, откуда взялся указатель и как он будет удален. А для какой-нибудь функции-фабрики метод выделения памяти — деталь реализации.
Еще замечание — все пользователи auto_heap_ptr должны знать про HeapFree(хотя можно конечно вручную писать extern'ы, или переходники). В принципе не проблема если заточено специально под winapi.
Умные указатели надо писать после ознакомления с реализацией boost::shared_ptr =)
Там есть непрозрачный(т.е. про HeapFree клиентам зать не нужно вообще) custom deleter который не является частью типа.
Минусы у него(shared_ptr) есть — но это цена за гибкость(type-erasure в частности).
Про winapi handle — иногда нужен явный контроль освобождения для обработки ошибок. Бустовцы в этом месте схитрили — у них в документации используется 'void fclose(FILE * f)' и 'void CloseHandle(HANDLE)'