Хорошо, наивная попытка генериков java будет Tree<void*>
.Это не очень хорошо, и многие люди заменят это следующим:
class TreeBase { };
class TreeInt : public TreeBase { int i; };
А затем используйте Tree<TreeBase*>
.Это позволяет вам указать, какие типы будут совместимы с ним.Это эквивалент объекта Java.
Еще один слой будет иметь Tree<Node> n;
с простым struct Node { TreeBase *b; };
Но поскольку мы говорим о деревьях, в c ++ есть гораздо лучший способ сделать это, поскольку он поддерживается напрямую.с помощью классов c ++:
class TreeNode { virtual ~TreeNode() { } };
class MyIntTreeNode : public TreeNode {
public:
MyTreeNode(int i) : i(i) { }
int i;
};
class MyStringTreeNode : public TreeNode {
public:
MyStringTreeNode(string s) : s(s) { }
string s;
};
class MyArrayTreeNode : public TreeNode {
public:
MyArrayTreeNode(std::vector<TreeNode*> v) : v(v) { }
std::vector<TreeNode*> v;
};
Создание дерева не может быть проще, если доступны необходимые типы:
int main() {
MyIntTreeNode n1(10);
MyStringTreeNode n2("abc");
std::vector<TreeNode*> v;
v.push_back(&n1);
v.push_back(&n2);
MyArrayTreeNode n3(v);
algo(n3);
}
Этот подход имеет то преимущество, что каждый триод может иметь различное поведение.Недостатком является то, что это немного многословно.