typename std::enable_if< std::is_same< void, decltype(std::declval<serializer&>().apply(std::declval<T&>())) >::value, serializer& >::type operator<<(serializer& sink, T& x) { sink.apply(x); return sink; }
typename std::enable_if< std::is_same< void, decltype(std::declval<serializer&>().apply(std::declval<T&>())) >::value, serializer& >::type operator<<(serializer& sink, const T& x) { // implementations are required to not change an object while serializing sink.apply(const_cast<T&>(x)); return sink; }