@Eugene-123

Как создать шаблон от наследников определенного класса?

Допустим у меня есть базовый класс и его потомки:
class NodeBase {
    int adjacent {}
}

class RedNode : public Node {
public:
    void RedNodeFunc() {}
}

class BlueNode : public Node {
public:
    void BlueNodeFunc() {}
}


Также есть класс:
class NodeContainer {
public:
    Node* node;
    void SomeActionOnNode() {}
}

Мне нужно вызывать методы обоих классов: NodeContainer и RedNode. Проблема в том, что мне приходится постоянно производить приведение типов:
// Здесь я точно знаю, что внутри nc указатель на RedNode
NodeContainer* nc;
((RedNode*)(nc->node))->RedNodeFunc();

Мне бы хотелось что-то типа:
NodeContainer<RedNode> * nc;
nc->RedNodeFunc();

Можно ли сделать так, что бы не надо было постоянно приводить типы? Как я понимаю надо создать шаблон:
template<class T> {
    T* node;
    void SomeActionOnNode() {
     auto nd = (Node*)node;
    // далее какие-то действия...
    }

Но в таком случае как мне быть уверенным, что шаблон создается только от потомков класса Node?
А во вторых не совсем понятно, решит ли это проблему с постоянным приведением?

P.S Для тех кто знаком с C#.
В языке C# с этим просто:
public class NodeContainer<T> where T : NodeBase {...}

А в C++, что типа такого есть?
  • Вопрос задан
  • 70 просмотров
Решения вопроса 1
@Flysink
Можно сделать шаблон, и не большую проверку в конструкторе "NodeContainer"
Это будет выглядеть:

template<class NODE>
class NodeContainer {
public:
	NodeContainer(NODE *n) :
		node(n)
	{
		static_assert(std::is_base_of<NodeBase, NODE>::value, "Derived class not derived from NodeBase");
	}

	NODE* node;
	void SomeActionOnNode() {}
};
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы