![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
zss |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
подскажите пожалуйста можно ли так сделать
есть функтор
он используется для удаления объектов, указатели которых храняться в контейнере (любом) хочется для контейнера создать функцию, которая убивала бы объекты по необходимости (в зависимости от функтора) что-то вроде
только хотелось бы еще и сам функтор задавать шаблонами Тоесть чтоб функция работала для любого контейнера с заданным функтором |
||||
|
|||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
zss,
Если в первом коде вроде всё нормально, то во втором куча проблем. 1. template <typename T, class Container = std::vector<T> > - спрашивается зачем дефолтить шаблонный параметр, да ещё и вектором. Не надо! 2. void DestroyContainer<T, Container > (Container<T>& container) { - зачем после имени функции опять перечислять шаблонные параметры? Не надо, шаблонные функции всё равно нельзя специализировать! 3. template <typename T, class Container, class Func > - тогда в коде пишешь std::for_each (container.begin(), container.end(), Func() ); и получаешь совсем обощённый механизм. Но тогда меняй название. 4. connections_.erase ( std::remove (container.begin(), container.end(), (T *)NULL), container.end() ); ну вот тут тоже не всё понятно, чего ты хочешь если у тебя функтор удаляет все элементы. Может просто clear() вызвать? |
|||
|
||||
zss |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
а чем это плохо ? если не ошибаюсь - нельзя частично специализировать
это этот функтор все удаляет. А если я подсуну функтор, который будет дергать методы класса и в зависимости от результата решать - удалять или нет для этого я и хочу функтор задавать шаблонно |
||||
|
|||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
А чем это хорошо? Что тебе это дает? Боюсь, что совсем ничего. Да. Но это не меняет сути, зачем потом писать параметры опять?
Я именно твоего данный код имел ввиду. |
|||
|
||||
zss |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
меньше писать ![]() согласен - аналогично моему ответу выше ![]() Daevaorn, только немного не понятно почему
не понятно, что Container и Func зависят от T я думал что будет что-то вроде
только Func опять не зависит от T |
||||
|
|||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
zss,
Если брать твой первоначальный код, то параметр T тебе был нужен лишь для того, тобы создать функтор. Но когда у тебя уже функтор как паремтр шаблона, то можно отказаться и от T. Он не нужен. Всё работу по этому поводу будет выполнять клиентский код, который в зависимости от ситуации будет сам выбирать парметры для функтора. И ещё, допустим, у вектора и один шаблонный параметр (ну если уже совсем быть точным, то только обязательный один), но это не значит, что у всех других контейнеров тоже самое. Так, что твой вариант ещё теряет обобщенность ![]() |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
Daevaorn, довольно убедительно - принимается
только хотелось бы для общего развития (и так сказать для закрепления) увидеть еще варианты (желательно с параметрами по-умолчанию) |
|||
|
||||
Chaos A.D. |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 16.1.2005 Где: 09 RUS Репутация: 6 Всего: 7 |
Я бы сделал так:
Это, ИМХО, как-то больше в стиле STL - функция работает с последовательностью. По-моему, так более гибко. Это сообщение отредактировал(а) Chaos A.D. - 3.3.2006, 15:38 --------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
Chaos A.D., а если итератор становится недействительным ?
P.S. Daevaorn, твой код не хочет собираться
|
|||
|
||||
Chaos A.D. |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 172 Регистрация: 16.1.2005 Где: 09 RUS Репутация: 6 Всего: 7 |
Я прогнал, erase это же функция-член контейнера...
--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
zss,
Было бы странно, если это у тебя бы скомпилировалось. Вот, как вариант:
|
|||
|
||||
zss |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
Daevaorn, а что я сейчас не так делаю
ругается на строку
Почему ? |
||||
|
|||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
zss, Ты это серьезно?
![]() if (!T->SomeMethod()) return false; Т это у тебя что? Правильно, тип. Тогда как ты у типа можешь вызвать не статический метод, да ещё и оператором ->? Никак. Значит пиши object вместо T ![]() Это сообщение отредактировал(а) Daevaorn - 3.3.2006, 17:50 |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
блин - все, приехали ![]() ![]() ![]() ![]() Daevaorn, большое тебе человеческое ... Это сообщение отредактировал(а) zss - 3.3.2006, 18:00 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |