Допустим у меня есть базовый класс и его потомки:
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++, что типа такого есть?