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 の静的アサートに直面したため、コードを上記のように変更しました。hereからの提案を採用し、<<
実装は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 を使用しています。