#include <iostream>
#include <iomanip>
#include <sstream>
#include <type_traits>

template<typename S, typename T>
class is_streamable
{
    template<typename SS, typename TT>
    static auto test(SS&& s, TT&& t) -> decltype(s << t);
    
    struct dummy_t {};
    static dummy_t test(...);
    
    using return_type = decltype(test(std::declval<S>(), std::declval<T>()));
    
public:
    static const bool value = !std::is_same<return_type, dummy_t>::value;
};

class C {};

class D {};

std::ostream& operator <<(std::ostream&, D const&);

int main() {
	std::cout << std::boolalpha;
	std::cout <<is_streamable<std::stringstream, C>::value << '\n';
	std::cout <<is_streamable<std::stringstream, D>::value << '\n';
	return 0;
}