Я пытаюсь узнать, как работают шаблоны в C++, поэтому я хотел бы реализовать дерево с использованием шаблонов C++. Вот традиционный полиморфный вариант:Реализация дерева с использованием шаблонов C++
#include <iostream>
using namespace std;
class Node {
public:
virtual ~Node() {}
virtual void print() = 0;
};
class InnerNode : public Node {
public:
InnerNode(Node *lhs, Node *rhs) {
m_lhs = lhs;
m_rhs = rhs;
}
virtual ~InnerNode() {
delete m_lhs;
delete m_rhs;
}
virtual void print() {
cout << "inner" << endl;
if (m_lhs != NULL)
m_lhs->print();
if (m_rhs != NULL)
m_rhs->print();
}
private:
Node *m_lhs;
Node *m_rhs;
};
class LeafNode : public Node {
virtual void print() {
cout << "leaf" << endl;
}
};
int main() {
Node *l1 = new LeafNode();
Node *l2 = new LeafNode();
Node *r = new InnerNode(l1, l2);
r->print();
}
Я пытаюсь реализовать версию этого кода, используя только шаблоны, но у меня возникают некоторые проблемы с чем-то вроде этого:
#include <iostream>
using namespace std;
template <typename T>
class Node {
public:
virtual ~Node() {}
void print() {
static_cast<T *>(this)->print();
}
};
class InnerNode : public Node<InnerNode> {
public:
InnerNode(Node *lhs, Node *rhs) {
m_lhs = lhs;
m_rhs = rhs;
}
virtual ~InnerNode() {
delete m_lhs;
delete m_rhs;
}
void print() {
cout << "inner" << endl;
if (m_lhs != NULL)
m_lhs->print();
if (m_rhs != NULL)
m_rhs->print();
}
private:
Node *m_lhs;
Node *m_rhs;
};
class LeafNode : public Node<LeafNode> {
virtual void print() {
cout << "leaf" << endl;
}
};
int main() {
Node *l1 = new LeafNode();
Node *l2 = new LeafNode();
Node *r = new InnerNode(l1, l2);
r->print();
}
Как я могу адаптировать вместо полиморфной версии использовать шаблоны?
Почему 'InnerNode' и' LeafNode' разные типы? Я ожидаю, что единственным типом использования шаблона будет тип данных, который удерживает узел. – Barry
Scala и другие функциональные языки имеют тенденцию использовать два типа для узлов Inner & Leaf. – Brad
Я понимаю, что - я только предлагаю, почему опросник, возможно, использовал эту парадигму. – Brad