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

如何通过 Graphviz DOT 文件中的数组属性 [SIZE] 读取未知属性,甚至不知道它的大小?例如,下面的代码总是错误的: dp.property("Attribute0", boost::get(&DotVertex::Attribute[0], graph_t))

4

1 回答 1

3

您可以使用任何属性映射。但是你需要一个有效的。

你所有的属性图都是无效的。主要是因为graph_t命名一个类型(使用graphviz?)。

最后一个是因为没有会员Attribute[0]。只有Attribute, 这是一个数组。因此,为了完全使用它,您需要添加一个转换。也可以看看

演示

Live On Coliru

#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);
}
于 2016-04-12T07:28:08.303 回答