Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> аргумент - функция 
:(
    Опции темы
ss
Дата 19.3.2017, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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) сделать шаблонной ? т.к. возможно функ.-обработчик возможно будет возвращать какое-либо значение ?
PM MAIL   Вверх
xvr
Дата 20.3.2017, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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


PM MAIL   Вверх
ss
Дата 20.3.2017, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 17.5.2007

Репутация: нет
Всего: нет



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

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

просто, иногда от обработчика может понадобится какой-либо результат.
PM MAIL   Вверх
xvr
Дата 20.3.2017, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

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

PM MAIL   Вверх
ss
Дата 21.3.2017, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 17.5.2007

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) ss - 21.3.2017, 19:25
PM MAIL   Вверх
xvr
Дата 21.3.2017, 22:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1240 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.