Перегрузка потоковых операторов для выходного пакета Boost Graph для GraphViz

Можно ли использовать связанные свойства в Boost Graph Library со стандартным типом библиотеки, а также использовать перегрузку этого типа << Оператор потока, чтобы удовлетворить 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;
}

Столкнувшись со статическим утверждением Boost, я изменил свой код к приведенному выше; принимая предложение от Вот, где << реализация определяется в рамках boost::detail::has_left_shift_impl Пространство имен. Увы, теперь я столкнулся с еще одной ошибкой:

/usr/include/boost/lexical_cast.hpp:1624:50: error: cannot bind ‘std::basic_ostream<char>’ lvalue to ‘std::basic_ostream<char>&&’
bool const result = !(out_stream << input).fail();

Есть ли способ обеспечить перегрузку << которые могут быть использованы write_graphviz? Я использую Ubuntu 14.10 и GCC 4.9.1.

2

Решение

Вы не могли даже сделать

std::cout << g[add_edge(0,1,{123,456},g)];

без предоставления, например,

inline static std::ostream& operator<<(std::ostream& os, std::array<double, 2> const& doubles) {
return os << "{" << doubles[0] << "," << doubles[1] << "}";
}

Теперь эти перегрузки видны lexical_cast в нужное время исключительно трудно сделать переносимым (в основном потому, что ADL не поможет вам с std::array а также double).

Вместо Вы можете использовать карту свойств преобразования значений (которая, конечно, доступна только для чтения):

std::string prettyprint(std::array<double, 2> const& arr) {
std::ostringstream oss;
oss << "{" << arr[0] << "," << arr[1] << "}";
return oss.str();
}

а потом 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))));
}

Печать

digraph G {
0;
1;
0->1 [label="{123,456}"];
}
3

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


По вопросам рекламы [email protected]