#include <iostream>
#include <vector>
#include <stdexcept>

template <typename T>
void f(const T &) { std::cout << "NO" << std::endl; }

template <typename T, int SFINAE = sizeof(static_cast<std::ostream &(std::ostream::*)(T)>(
	&std::ostream::operator<<))>
void f(const T &) { std::cout << "YES" << std::endl; }

int main() {
	typedef const char *(std::exception::*F0)() const;
 	F0 f0 = &std::exception::what;

	f(0);
	f("abc");
	f(static_cast<const char *>("abc"));
	f(0.);
	f(f0);
	f(std::vector<int>());

	return 0;
}