powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ограничение на параметры шаблонов
9 сообщений из 9, страница 1 из 1
Ограничение на параметры шаблонов
    #39656778
Вот хочу я, например, написать какую-то такую шаблонную функцию:
Код: plaintext
1.
2.
3.
4.
5.
6.
	template<class Node> 
	void addNode(std::shared_ptr<CompositeNode> & currentNode, const std::string & line) {
		std::shared_ptr<Node> node = std::make_shared<Node>(currentNode);
		node->readAttributes(line);
		currentNode->addChild(node);
	}


Функция принимает ноду дерева и должна создать и добавить к ней нового ребёнка. При этом, существует несколько типов нод, и какую именно нужно создать определяет вызывающий код и должен передать эту инфу в функцию. Для этого использую шаблон.
Собственно вопрос, можно ли как-то задать ограничение на родительский класс параметра шаблона? Например, в джаве можно было бы написать что-то вроде <Node extends TreeNode> (правда, в джаве создавать ноду пришлось бы через одно место рефлексию, но это уже совсем другая история, лол), а в С++, я так понимаю, так нельзя и все косяки в содержимом функции обнаружатся, только когда кто-то её попытается вызвать?
...
Рейтинг: 0 / 0
Ограничение на параметры шаблонов
    #39656788
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ржавый гвоздь,

std::enable_if вместе с std::is_base_of
...
Рейтинг: 0 / 0
Ограничение на параметры шаблонов
    #39656796
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Должно быть как-то так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
	template<class Node>
	std::enable_if_t<std::is_base_of<TreeNode, Node>::value, void>
	addNode(std::shared_ptr<CompositeNode> & currentNode, const std::string & line) {
		std::shared_ptr<Node> node = std::make_shared<Node>(currentNode);
		node->readAttributes(line);
		currentNode->addChild(node);
	}
...
Рейтинг: 0 / 0
Ограничение на параметры шаблонов
    #39656799
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ржавый гвоздьможно ли как-то задать ограничение на родительский класс параметра шаблона?

Можно выкинуть напрочь шаблон и... всё, ограничение введётся автоматически при задании в
качестве параметра этого самого родительского класса.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ограничение на параметры шаблонов
    #39656804
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovМожно выкинуть напрочь шаблон и... всё, ограничение введётся автоматически при задании в
качестве параметра этого самого родительского класса.

Как я понимаю, у него не фигурирует родительский класс в аргументах функции.
...
Рейтинг: 0 / 0
Ограничение на параметры шаблонов
    #39656806
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZу него не фигурирует родительский класс в аргументах функции.

А зря. Правильное наследование и полиморфизм - гораздо удобнее шаблонизации. По крайней
мере - гораздо читабельнее.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ограничение на параметры шаблонов
    #39656810
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovА зря. Правильное наследование и полиморфизм - гораздо удобнее шаблонизации. По крайней
мере - гораздо читабельнее.

С этим нельзя спорить. Но порой возникают такие ситуации, когда без таких
шаблонных непотребств не обойтись.
...
Рейтинг: 0 / 0
Ограничение на параметры шаблонов
    #39656830
NekZКак я понимаю, у него не фигурирует родительский класс в аргументах функции.
Ага, именно так.
NekZДолжно быть как-то так

Спасибо, то что надо!
...
Рейтинг: 0 / 0
Ограничение на параметры шаблонов
    #39656885
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ржавый гвоздьNekZКак я понимаю, у него не фигурирует родительский класс в аргументах функции.
Ага, именно так.
NekZДолжно быть как-то так

Спасибо, то что надо!

Тебе придётся явно инстанциировать функцию с указанным классом Node.

addNode<NodeType1>(currentNode, line);
addNode<NodeType2>(currentNode, line);

и так далее.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Ограничение на параметры шаблонов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]