int const SIZE=10;
struct DotVertex {
int Attribute[SIZE];
};
struct DotEdge {
std::string label;
};
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS,
DotVertex, DotEdge> graph_t;
int main() {
graph_t graphviz;
boost::dynamic_properties dp(boost::ignore_other_properties);
dp.property("node_id", boost::get(&DotVertex::name, graph_t));
dp.property("Attribute0", boost::get(&DotVertex::Attribute[0], graph_t));
std::ifstream dot("graphnametest2.dot");
boost::read_graphviz(dot, graph_t, dp);
Как прочитать неизвестные свойства по атрибуту массива [SIZE] из файла Graphviz DOT или даже не знать его размер? Например, следующий код всегда неверен:
dp.property («Attribute0», boost :: get (&DotVertex :: Attribute [0], graph_t))
Вы можете использовать любую карту недвижимости. Но вам нужен действительный.
Все ваши карты недвижимости недействительны. В основном потому что graph_t
называет тип (используйте graphviz
?).
Последний, потому что нет члена Attribute[0]
, Есть только Attribute
, который является массивом. Поэтому, чтобы использовать его вообще, нужно добавить преобразование. Смотрите также
Жить на Колиру
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/graphviz.hpp>
int const SIZE=10;
struct DotVertex {
std::string name;
int Attribute[SIZE];
};
struct DotEdge {
std::string label;
};
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, DotVertex, DotEdge> graph_t;
#include <boost/phoenix.hpp>
using boost::phoenix::arg_names::arg1;
int main() {
graph_t graphviz;
boost::dynamic_properties dp(boost::ignore_other_properties);
dp.property("node_id", boost::get(&DotVertex::name, graphviz));
dp.property("label", boost::get(&DotEdge::label, graphviz));
auto attr_map = boost::get(&DotVertex::Attribute, graphviz);
for (int i = 0; i<SIZE; ++i)
dp.property("Attribute" + std::to_string(i),
boost::make_transform_value_property_map(arg1[i], attr_map));
std::ifstream dot("graphnametest2.dot");
boost::read_graphviz(dot, graphviz, dp);
}
Других решений пока нет …