#ifndef BINARY_OUTPUT_HPP #define BINARY_OUTPUT_HPP #include // static_asserts are not too good... // Normal template struct binary{ T thing; binary(T const t):thing(t){} binary(binary const& c):thing(c.thing){} }; template binary make_binary(T const t){ return binary(t); } template std::ostream& operator<<(std::ostream& out, binary const& rhs){ static_assert(std::is_pod::value, "Please specialise this function if your type is not POD"); static_assert(!std::is_pointer::value, "Writing pointer"); out.write(reinterpret_cast(&(rhs.thing)), sizeof(rhs.thing)); return out; } // Array template struct binary_arr{ T const (& thing)[N]; binary_arr(const T (& t)[N]):thing(t){} binary_arr(binary_arr const& c):thing(c.thing){} }; template binary_arr make_binary(const T (& t)[N]){ static_assert(N>=0, "lijp"); return binary_arr(t); } template std::ostream& operator<<(std::ostream& out, binary_arr const& rhs){ static_assert(std::is_pod::value, "Please specialise this function if your type is not POD"); static_assert(!std::is_pointer::value, "Writing pointer"); out.write(reinterpret_cast(&(rhs.thing)), sizeof(rhs.thing)); return out; } #endif // BINARY_OUTPUT_HPP