2015-11-16 5 views
2

Я пытаюсь преобразовать использование алгоритма boost::graph в новый набор классов реализации. Мне интересно: возможно ли получить доступ к свойствам объекта, если boost::graph хранит только std::shared_ptr ссылок? Как и в следующем:Доступ к функции-члену std :: shared_ptr в boost :: graph?

class Vert { 
public: 
    Vert(); 
    Vert(std::string n); 
    std::string getName() const; 
    void setName(std::string const& n); 
private: 
    std::string name; 

}; 
typedef std::shared_ptr<Vert> Vert_ptr; 

using namespace boost; 
typedef boost::adjacency_list<vecS, vecS, directedS, Vert_ptr> Graph; 
Graph g; 
Vert_ptr a(new Vert("a")); 
add_vertex(a, g); 
std::ofstream dot("test.dot"); 
write_graphviz(dot, g, make_label_writer(boost::get(&Vert::getName,g))); //ERROR! 

Можно ли получить доступ к членам в std::shared_ptr использовать в графе этикетки писателя write_graphviz или каких-либо других свойств в реализации?

Спасибо!

ответ

3

Да просто использовать трансформирование свойство карты

Live On Coliru

#include <boost/graph/adjacency_list.hpp> 
#include <boost/graph/graphviz.hpp> 
#include <boost/property_map/transform_value_property_map.hpp> 
#include <fstream> 
#include <memory> 

using namespace boost; 

class Vert { 
public: 
    Vert(std::string n="") : name(n) { } 
    std::string getName() const { return name; } 
    void setName(std::string const& n) { name = n; } 
private: 
    std::string name; 
}; 

typedef std::shared_ptr<Vert> Vert_ptr; 

struct Name { std::string operator()(Vert_ptr const& sp) const { return sp->getName(); } }; 

int main() { 
    typedef boost::adjacency_list<vecS, vecS, directedS, Vert_ptr> Graph; 
    Graph g; 
    Vert_ptr a(new Vert("a")); 
    add_vertex(a, g); 
    std::ofstream dot("test.dot"); 
    auto name = boost::make_transform_value_property_map(Name{}, get(vertex_bundle,g)); 
    write_graphviz(dot, g, make_label_writer(name)); 
} 

Результат:

digraph G { 
0[label=a]; 
} 
+0

Спасибо ... хотя моя текущая версия подталкивание (v1.50) не знаю 'make_transform_value_property_map', я считаю. После этого я должен проверить, является ли мой компилятор (MSVC2010), если он поддерживает этот синтаксис 'Name {}'. – Hhut

+1

Замените его 'Name()' ... – sehe

+0

Введена карта свойств Transform-value r77535 25 марта 2012 года, а это значит, что она не меньше 1.56. У меня есть альтернативная идея. Подожди – sehe