Доступ к функции-члену std :: shared_ptr в boost :: graph?

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

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 или какие-либо другие свойства в реализации?

Спасибо!

2

Решение

Да, просто используйте карту недвижимости-трансформера

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

#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];
}
3

Другие решения

Других решений пока нет …