На картах свойств key_type (boost::property_traits<PMap>::key_type
) сообщает библиотеке, к какому типу объекта принадлежит свойство:
graph_traits<G>::vertex_descriptor
присоединяет атрибут к объектам типа узла (вершины) graph_traits<G>::edge_descriptor
прикрепляет атрибуты к ребрам G*
прикрепляет атрибуты на уровне графа
Поэтому вам нужно использовать vertex_descriptor
вместо VertexP*
для этих карт:
dp.property("fixedsize", boost::make_constant_property<Graph::vertex_descriptor>(+"true"));
dp.property("width", boost::make_constant_property<Graph::vertex_descriptor>(1));
dp.property("height", boost::make_constant_property<Graph::vertex_descriptor>(1));
Обратите внимание, что используются потоковые операции по умолчанию, поэтому нет необходимости специально конвертировать в std::string
Обратите внимание, что что атрибуты записываются во временные потоки, поэтому std::boolalpha
не учитывается. Также обратите внимание, что использование строкового литерала приведет к созданию экземпляра карты свойств с char const(&)[5]
, поэтому используется +"true"
(с уменьшением до char const*
).
Full Demo
Live On Coliru
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
struct VertexP {
std::string tag, shape, style, pos;
};
struct ArrowP {
std::string symbol, color, style;
};
using Graph = boost::adjacency_list<
boost::vecS, boost::vecS, boost::directedS,
VertexP, ArrowP>;
int main() {
Graph g;
boost::dynamic_properties dp;
dp.property("rankdir", boost::make_constant_property<Graph*>(+"TB"));
dp.property("node_id", get(&VertexP::tag, g));
dp.property("label", get(&VertexP::tag, g));
dp.property("shape", get(&VertexP::shape, g));
dp.property("style", get(&VertexP::style, g));
dp.property("pos", get(&VertexP::pos, g));
dp.property("label", get(&ArrowP::symbol, g));
dp.property("color", get(&ArrowP::color, g));
dp.property("style", get(&ArrowP::style, g));
dp.property("fixedsize", boost::make_constant_property<Graph::vertex_descriptor>(+"true"));
dp.property("width", boost::make_constant_property<Graph::vertex_descriptor>(1));
dp.property("height", boost::make_constant_property<Graph::vertex_descriptor>(1));
add_edge(
add_vertex({"foo", "diamond", "dotted", "0,1"}, g),
add_vertex({"bar", "circle", "dashed", "1,1"}, g),
{"foo-bar", "blue", "dashed"},
g);
write_graphviz_dp(std::cout, g, dp);
}
Печать
digraph G {
rankdir=TB;
bar [fixedsize=true, height=1, label=bar, pos="1,1", shape=circle, style=dashed, width=1];
foo [fixedsize=true, height=1, label=foo, pos="0,1", shape=diamond, style=dotted, width=1];
foo->bar [color=blue, label="foo-bar", style=dashed];
}