Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > аргумент - функция


Автор: ss 19.3.2017, 17:45
У меня есть дерево. Делаю алгоритм обхода дерева. Чтобы для каждого дерева не делать одну и ту же механику, хочу сделать универсальную.
функ. forAllNode(Tree*t, func f, Node* n);
параметр func - это некая функ. применяемая ко всем элементам дерева.
вот как-то так:
typedef void (*Func)(Node*);  
void forAllNode(Tree*t, Func f, Node* n); 

можно ли как-нибудь функ.-обработчик(Func) сделать шаблонной ? т.к. возможно функ.-обработчик возможно будет возвращать какое-либо значение ?

Автор: xvr 20.3.2017, 15:27
Шаблонной (в терминах С++) только если сама forAllNode так же будет шаблонной. Если же надо просто вернуть некоторое значение, то так вашу функцию и опишите - 
typedef int (*Func)(Node*); (int устроит в качестве возвращаемого значения?)


Автор: ss 20.3.2017, 18:16
forAllNode  эта функ. которая будет рекурсивно вызываться проходя по всем элементам дерева и для каждого элемента будет вызывать обработчик func f.

Можно ли сам обработчик сделать шаблонным вместе с forAllNode  не указывая явно тип void, int ... ? 
что-то такое :
forAllNode<T>(t, f<T>, n)

просто, иногда от обработчика может понадобится какой-либо результат.

Автор: xvr 20.3.2017, 22:29
Как вы этот результат собираетесь использовать в forAllNode если вы заранее не знаете, что именно в него может вернуть обработчик? У вас же функция forAllNode одна на все узлы.

Дайте пример, как вы собираетесь использовать возвращаемое обработчиком значение.

Автор: ss 21.3.2017, 19:19
обработчик будет написан любой. Возвращать или не возвращать значение обработчик будет в зависимости от его реализации.
Механика обхода дерева будет одна. Меняются только данные и функция применяемая к узлам дерева.
Напр. обработчик который будет выполнять :
поиск некого элемента и вернуть значение, а значение может быть любым как std:list, или ссылку на узел дерева;
заменить одни значения другими и ничего не возвращать или вызвать метод некого объекта который содержится в узле для каждого элемента дерева. 
ну и все в том духе.

Автор: xvr 21.3.2017, 22:35
Цитата(ss @  21.3.2017,  19:19 Найти цитируемый пост)
Возвращать или не возвращать значение обработчик будет в зависимости от его реализации.

Кто будет это возвращаемое значение потреблять? Тот, кто вызывает (forAllNode) потреблять не может, так как он о нем ничего не знает. И никто другой напрямую так же не может, т.к. вызов обработчика скрыт внутри forAllNode.
Когда вы определитесь с тем, кто и как это значение должен потреблять, тогда и вопрос как его возвращать решится сам собой  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)