Я пытаюсь прочитать график из файла Graphviz DOT с помощью библиотеки графиков Boost. как прочитать неизвестное количество свойств, которое хранится в массиве?

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))

1 ответ

Вы можете использовать любую карту недвижимости. Но вам нужен действительный.

Все ваши карты недвижимости недействительны. В основном потому что graph_t называет тип (используйте graphviz?).

Последний, потому что нет члена Attribute[0], Есть только Attribute, который является массивом. Поэтому, чтобы использовать его вообще, нужно добавить преобразование. Смотрите также

DEMO

Жить на Колиру

#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);
}
Другие вопросы по тегам