ИМХО, ты задумал неудачную идею. Я бы юзал классы-traits вместо функций обёрнутых в namespace. Писанины немногим меньше, а гибкость выше — можешь наследовать их друг от друга, можешь добавить какие-то методы без изменения основного интерфейса.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: как бы передать в шаблон NULL или INVALID_HANDLE_VALU
L>ИМХО, ты задумал неудачную идею. Я бы юзал классы-traits вместо функций обёрнутых в namespace. Писанины немногим меньше, а гибкость выше — можешь наследовать их друг от друга, можешь добавить какие-то методы без изменения основного интерфейса.
были traits...
но получалось что для новых хандлов они получались одинаковыми смотри что было:
с функцией закрытия хандлов я намутил
они оказывается одинаковый прототип имеют и такое вполне прокатит...
пока не найдётся какая-нибудь не укладывающаяся сюда
КЛ>
Здравствуйте, gid_vvp, Вы писали:
_>были traits... _>но получалось что для новых хандлов они получались одинаковыми смотри что было:
Было бы использовать свойство для получения неверного значения хэндла (лучше функция, т.к. неверными могут быть и NULL, и -1 одновременно), а стратегию — для закрытия хэндла. Тогда одно свойство можно использовать в комбинации с разными стратегиями.
--
wbr, icestudent
Re[4]: как бы передать в шаблон NULL или INVALID_HANDLE_VALU
IS>Было бы использовать свойство для получения неверного значения хэндла (лучше функция, т.к. неверными могут быть и NULL, и -1 одновременно), а стратегию — для закрытия хэндла. Тогда одно свойство можно использовать в комбинации с разными стратегиями.
откуда дровишки?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: как бы передать в шаблон NULL или INVALID_HANDLE_VALU
А для того чтобы они не получались одинаковыми есть такая замечательная вещь как наследование. Причём поскольку функции тут только статик, то ты запросто можешь юзать даже множественное наследование (никаких оверхедов не будет).
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: как бы передать в шаблон NULL или INVALID_HANDLE_VALU
Здравствуйте, gid_vvp, Вы писали:
IS>>Было бы использовать свойство для получения неверного значения хэндла (лучше функция, т.к. неверными могут быть и NULL, и -1 одновременно), а стратегию — для закрытия хэндла. Тогда одно свойство можно использовать в комбинации с разными стратегиями.
_>откуда дровишки?
Из-за инициализации HANDLE через NULL, а не INVALID_HANDLE_VALUE (в том же ATL::CHandle или если принимаешь уже инициализированный так HANDLE).
--
wbr, icestudent
Re[3]: как бы передать в шаблон NULL или INVALID_HANDLE_VALU
Здравствуйте, gid_vvp, Вы писали:
_>не могу уловить фишку...
Ну это то, о чём я говорил выше, что вместо значения использовать функцию, проверяющую хэндл на валидность. Но с другой стороны — можно взять за правило инициализацию через -1, тогда проблема отпадает.
--
wbr, icestudent
Re[6]: как бы передать в шаблон NULL или INVALID_HANDLE_VALU
IS>Из-за инициализации HANDLE через NULL, а не INVALID_HANDLE_VALUE (в том же ATL::CHandle или если принимаешь уже инициализированный так HANDLE).
1. довольно странная идея использовать одну обёртку для хандлов вместе с другой
2. ATL::CHandle не стоит использовать с хандлами файлов ибо CreateFile в случае ошибки возвращает ни что иное как INVALID_HANDLE_VALUE и следовательно невалидный хандл файла это INVALID_HANDLE_VALUE и ни что больше
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: как бы передать в шаблон NULL или INVALID_HANDLE_VALU
L>А для того чтобы они не получались одинаковыми есть такая замечательная вещь как наследование. Причём поскольку функции тут только статик, то ты запросто можешь юзать даже множественное наследование (никаких оверхедов не будет).
Здравствуйте, gid_vvp, Вы писали:
_>1. довольно странная идея использовать одну обёртку для хандлов вместе с другой
Не вместе. Просто пример реализации.
_>2. ATL::CHandle не стоит использовать с хандлами файлов ибо CreateFile в случае ошибки возвращает ни что иное как INVALID_HANDLE_VALUE и следовательно невалидный хандл файла это INVALID_HANDLE_VALUE и ни что больше
ATL::CHandle — это просто обёртка для HANDLE, чтобы автоматически закрывать хэндл при выходе из области видимости или при исключении.
--
wbr, icestudent
Re[8]: как бы передать в шаблон NULL или INVALID_HANDLE_VALU
_>>1. довольно странная идея использовать одну обёртку для хандлов вместе с другой IS>Не вместе. Просто пример реализации.
Зачем этот пример?
Как неследует делать?
_>>2. ATL::CHandle не стоит использовать с хандлами файлов ибо CreateFile в случае ошибки возвращает ни что иное как INVALID_HANDLE_VALUE и следовательно невалидный хандл файла это INVALID_HANDLE_VALUE и ни что больше IS>ATL::CHandle — это просто обёртка для HANDLE, чтобы автоматически закрывать хэндл при выходе из области видимости или при исключении.
ещё раз повторяю невалидный хандл файла это INVALID_HANDLE_VALUE и ни что больше
для други хандлов другие невалидные значения бывают.
смотри пример
ATL::CHandle h = CreateFile(....); // допустим что неудачно завершилась функция и h == INVALID_HANDLE_VALUE
и конечно в своём деструкторе он попытается закрыть хандл равный INVALID_HANDLE_VALUE
ни чего страшного не случится потому что внутри CloseHandle скорее всего есть проверка...
но неправильное использование налицо
или вот ещё замечательный пример иллюстрирующий убожество ATL::CHandle и мои слова о том что его лучше не использовать для хандлов файлов
ATL::CHandle h(CreateFile(....));// допустим что неудачно завершилась функция и h == INVALID_HANDLE_VALUEif(h)
{
// работаем с файлом... даже если он не открылся :))
}
else
{
//обработка ошибок... только сюда мы никогда не попадём :)
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: как бы передать в шаблон NULL или INVALID_HANDLE_VALU
Да, что-то типа такого. Ну кроме того что я бы наверное и typedef для HANDLE вынес в отдельного предка и от него бы всё наследовал.
А какими критериями ты определяешь что лучше а что нет? По количеству кода?
Я бы не стал экономить на количестве строк, благо такого кода у тебя всё равно не будет много — вариантов хэндлов с разными политиками пару десятков, не больше.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: как бы передать в шаблон NULL или INVALID_HANDLE_VALU
L>Да, что-то типа такого. Ну кроме того что я бы наверное и typedef для HANDLE вынес в отдельного предка и от него бы всё наследовал.
L>А какими критериями ты определяешь что лучше а что нет? По количеству кода? L>Я бы не стал экономить на количестве строк, благо такого кода у тебя всё равно не будет много — вариантов хэндлов с разными политиками пару десятков, не больше.
По варазительности и простоте
Но конечно это субъективно...