通过boost :: read_graphviz()读取提升动态属性时出现异常

时间:2015-12-16 14:25:16

标签: c++ boost graph graphviz boost-graph

我已经向docs询问了如何将动态属性写入DOT文件。它的工作正常。现在,当我尝试读取DOT文件并构建我的图表时,我遇到了一些异常。基本上我按照类似的方式写作,以读取DOT文件。以下是我的尝试:

我有一个Map类,它使用Cell类作为顶点,Cell类使用单独的CellProperty类来设置和获取所有Cell属性。请参考链接的问题,了解整个班级结构。

  boost::dynamic_properties mPropertiesR(boost::ignore_other_properties);
  mPropertiesR.property("ID", boost::get(boost::vertex_index, mGraph));

  auto valueNavigable = boost::make_transform_value_property_map(
  [](Cell &cell) { return cell.GetProperty<bool>("Navigable", false); }, boost::get(boost::vertex_bundle, mGraph));
  mPropertiesR.property("Navigable", valueNavigable);

  std::ifstream fin(mGraphFilePath.c_str());
  std::string const &node_id = "node_id";
  boost::read_graphviz(fin, mGraph, mPropertiesR, "node_id");

  boost::graph_traits<Graph>::vertex_iterator vi, vi_end, next;
  boost::tie(vi, vi_end) = boost::vertices(mGraph);
  for (next = vi; vi != vi_end; vi = next) {
     // cell.GetProperty() is a templated method the takes a default parameter, thus passing "false" bool parameter which returns the "Navigable" cell property
     std::cout<< ": The Navigable property set to  :" << mGraph[*next].GetProperty<bool>("Navigable", false);
     ++next;
  }

上面的代码编译但我得到一个例外:

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::dynamic_const_put_error> >'
what():  Attempt to put a value into a const property map: 
Aborted (core dumped)

GetProperty()方法使用CellProperty类来获取每个单元格的属性值。以下是GetProperty()方法的样子:

  template <class T>
  T GetProperty(std::string pPropertyName, T pDefaultValue = T()) {
     try {
        T propertyValue = boost::lexical_cast<T>( mCellProperty.GetPropertyString(pPropertyName, boost::lexical_cast<std::string>(pDefaultValue)));
        return propertyValue;
     } catch (...) {
        std::cout<< ":  Unknown exception thrown while getting cell property value :'" << pPropertyName << "'";
     }
     return pDefaultValue;
  }

我想要的是检索图中的顶点属性,我从DOT文件中读取它,就像&#34; Navigable&#34;财产等。我无法弄清楚,究竟我做错了什么。请帮我。提前谢谢!

1 个答案:

答案 0 :(得分:1)

  

我不太确定应该对我的GetProperty()方法进行哪些修改。

said this before

  

另外,请注意如何将lambda中的内容(cell.GetProperty<bool>("Navigable", false);)包含在内是至关重要的,没有人可以为你做到这一点,因为信息并不存在。

我们无法知道如何编写它,因为您没有显示如何首先访问该属性

这里也是如此。我会给你另一个指针。

您需要为可变属性映射实现ReadWritePropertyMapLvaluePropertyMap的模型。

有关如何实现读写属性映射的示例,请参阅此答案:查找property_traits<bidi_color_map>以及putget函数: