c++ - Overloading streaming operators for a Boost Graph bundle output for GraphViz -
is possible use bundled properties in boost graph library, standard library type, while using type's overload of <<
stream operator satisfy write_graphviz
?
#include <boost/graph/graphviz.hpp> namespace boost { namespace detail { namespace has_left_shift_impl { template <typename t> inline std::ostream &operator<<(std::ostream &o, const std::array<t,2> &a) { o << a[0] << ',' << a[1]; return o; } } } } static_assert(boost::has_left_shift< std::basic_ostream<char>, std::array<double,2> >::value,""); int main() { using namespace boost; typedef adjacency_list<vecs, vecs, directeds, no_property, std::array<double,2>> graph; graph g; add_edge(0, 1, {123,456}, g); write_graphviz(std::cout, g, default_writer(), make_label_writer(boost::get(edge_bundle,g))); return 0; }
faced boost static assert, modified code above; adopting suggestion here, wherein <<
implementation defined within boost::detail::has_left_shift_impl
namespace. alas, i'm faced error:
/usr/include/boost/lexical_cast.hpp:1624:50: error: cannot bind ‘std::basic_ostream<char>’ lvalue ‘std::basic_ostream<char>&&’ bool const result = !(out_stream << input).fail();
is there way provide overload of <<
can used write_graphviz
? i'm using ubuntu 14.10 , gcc 4.9.1.
you couldn't
std::cout << g[add_edge(0,1,{123,456},g)];
without providing e.g.
inline static std::ostream& operator<<(std::ostream& os, std::array<double, 2> const& doubles) { return os << "{" << doubles[0] << "," << doubles[1] << "}"; }
now getting these overloads seen lexical_cast
@ right time exceptionally hard portably (mostly because adl won't std::array
, double
).
instead can use value transforming property map (which readonly of course):
std::string prettyprint(std::array<double, 2> const& arr) { std::ostringstream oss; oss << "{" << arr[0] << "," << arr[1] << "}"; return oss.str(); }
and make_transform_value_property_map(prettyprint, get(edge_bundle, g))
#include <boost/graph/adjacency_list.hpp> #include <boost/graph/graphviz.hpp> using namespace boost; std::string prettyprint(std::array<double, 2> const& arr) { std::ostringstream oss; oss << "{" << arr[0] << "," << arr[1] << "}"; return oss.str(); } int main() { using namespace boost; typedef adjacency_list<vecs, vecs, directeds, no_property, std::array<double,2>> graph; graph g; add_edge(0, 1, {123,456}, g); write_graphviz(std::cout, g, default_writer(), make_label_writer(make_transform_value_property_map(&prettyprint, get(edge_bundle, g)))); }
prints
digraph g { 0; 1; 0->1 [label="{123,456}"]; }
Comments
Post a Comment