|
Модераторы: Daevaorn |
|
ss |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 131 Регистрация: 17.5.2007 Репутация: нет Всего: нет |
У меня есть дерево. Делаю алгоритм обхода дерева. Чтобы для каждого дерева не делать одну и ту же механику, хочу сделать универсальную.
функ. forAllNode(Tree*t, func f, Node* n); параметр func - это некая функ. применяемая ко всем элементам дерева. вот как-то так: typedef void (*Func)(Node*); void forAllNode(Tree*t, Func f, Node* n); можно ли как-нибудь функ.-обработчик(Func) сделать шаблонной ? т.к. возможно функ.-обработчик возможно будет возвращать какое-либо значение ? |
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Шаблонной (в терминах С++) только если сама forAllNode так же будет шаблонной. Если же надо просто вернуть некоторое значение, то так вашу функцию и опишите -
typedef int (*Func)(Node*); (int устроит в качестве возвращаемого значения?) |
|||
|
||||
ss |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 131 Регистрация: 17.5.2007 Репутация: нет Всего: нет |
forAllNode эта функ. которая будет рекурсивно вызываться проходя по всем элементам дерева и для каждого элемента будет вызывать обработчик func f.
Можно ли сам обработчик сделать шаблонным вместе с forAllNode не указывая явно тип void, int ... ? что-то такое : forAllNode<T>(t, f<T>, n) просто, иногда от обработчика может понадобится какой-либо результат. |
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Как вы этот результат собираетесь использовать в forAllNode если вы заранее не знаете, что именно в него может вернуть обработчик? У вас же функция forAllNode одна на все узлы.
Дайте пример, как вы собираетесь использовать возвращаемое обработчиком значение. |
|||
|
||||
ss |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 131 Регистрация: 17.5.2007 Репутация: нет Всего: нет |
обработчик будет написан любой. Возвращать или не возвращать значение обработчик будет в зависимости от его реализации.
Механика обхода дерева будет одна. Меняются только данные и функция применяемая к узлам дерева. Напр. обработчик который будет выполнять : поиск некого элемента и вернуть значение, а значение может быть любым как std:list, или ссылку на узел дерева; заменить одни значения другими и ничего не возвращать или вызвать метод некого объекта который содержится в узле для каждого элемента дерева. ну и все в том духе. Это сообщение отредактировал(а) ss - 21.3.2017, 19:25 |
|||
|
||||
xvr |
|
|||
Эксперт Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Кто будет это возвращаемое значение потреблять? Тот, кто вызывает (forAllNode) потреблять не может, так как он о нем ничего не знает. И никто другой напрямую так же не может, т.к. вызов обработчика скрыт внутри forAllNode. Когда вы определитесь с тем, кто и как это значение должен потреблять, тогда и вопрос как его возвращать решится сам собой |
|||
|
||||
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |