Напишите динамическое дерево, в котором вы можете во время выполнения изменять структуру дерева, в которой есть разные типы в каждой ссылке, для этого потребуется typeid. dynamic_cast недостаточно.
Редактировать: вот некоторые детали:
class I {
public:
virtual std::string type() const=0;
virtual void *value() const=0;
};
template<class T>
class Impl : public I
{
public:
Impl(T t) : t(t) { }
std::string type() const { return typeid(T).name(); }
void *value() const { return &t; }
private:
T t;
};
А затем построить дерево из них:
template<class Node, class Link>
class Tree { };
С типом связи, являющимся интерфейсом I * ... Поскольку вышеприведенное работает для любых значений типа T1, T2, T3, T4, мы могли бы также использовать аналогичные классы для любых функций T-> T1, T-> T2, T-> T3, T-> T4, и используйте этот тип функции в качестве узла дерева. Теперь у вас есть правильные выражения, описанные в динамическом дереве.