Теоретически у вас может быть что-то вроде этого:
struct tree_vertex_info; // forward-declaration
typedef boost::adjacency_list<
boost::listS, boost::listS, boost::directedS,
tree_vertex_info, boost::no_property, graph_info> Tree;
struct tree_vertex_info {
boost::graph_traits<Tree>::vertex_descriptor parent_in_tree;
};
Однако для этого потребуется, чтобы шаблон класса boost::adjacency_list
поддерживал неполные типы (именно это и есть tree_vertex_info
, пока есть только прямое объявление, пока компилятор не достигнет его полного объявления). Насколько я знаю, класс boost::adjacency_list
не поддерживает неполные типы (и я знаю эту реализацию совсем немного, и я не думаю, что она будет работать) и, конечно, не гарантируется их поддержка.
На самом деле я работаю над новой версией boost::adjacency_list
, которую я называю boost::adjacency_list_BC
, потому что она основана на контейнерах Boost.Container и будет поддерживать неполные типы. Тем не менее, он все еще находится на стадии бета-тестирования (следуйте здесь или здесь), а последние версии Boost.Container, похоже, сломал что-то, что мне еще нужно выяснить. Между прочим, у меня также есть ряд структур данных дерева BGL, а также новые концепции и признаки BGL для деревьев (поскольку вы, похоже, реализуете своего рода дерево).
Кроме того, если ваша мотивация для этого действительно то, что у вас есть («родитель-в-дереве»), тогда вы должны использовать boost::bidirectionalS
в своем adjacency_list
, чтобы иметь возможность перейти от дочерней вершины к ее родителю (это то, что boost::bidirectionalS
означает , вы получите двунаправленный график).
Наконец, чтобы решить эту ситуацию, в которой вы оказались, вам придется использовать метод стирания шрифта. Простой готовый способ сделать это — использовать boost::any
для стирания типа vertex_descriptor, например:
struct tree_vertex_info{
// descriptor of parent vertex
boost::any parent_in_tree;
};
// the tree graph type
typedef boost::adjacency_list<boost::listS, boost::listS, boost::directedS
tree_vertex_info, boost::no_property, graph_info> Tree;
Просто найдите Boost.Any, чтобы получить инструкции по его использованию. .
Я думал, что могу использовать переменную int вместо типа vertex_descriptor для хранения vertex_descriptors, но, поскольку я использую listS для их хранения, я не уверен, что смогу.
Нет, ты не можешь. Вы не можете зависеть от того, является ли тип vertex_descriptor чем-то конкретным (например, вы не можете предполагать, что это целочисленный тип, не говоря уже о «int»). Я знаю, что vertex_descriptor обычно является либо типом итератора (например, std::list<T>::iterator
), либо типом размера (например, std::size_t
или std::vector<T>::size_type
), но это деталь реализации, на которую вы не должны и не можете полагаться.
person
Mikael Persson
schedule
23.09.2014