std::declval<StreamT&>() << std::declval<T const &>() bool, .
template <typename T,
typename StreamT,
typename = void>
struct Can_output_directly : std::false_type {};
template <typename T,
typename StreamT>
struct Can_output_directly<T, StreamT, std::void_t<decltype(std::declval<StreamT&>() << std::declval<T const &>())>> : std::true_type {};
// ^^^^^^^^^^^ C++17 feature
make_printable:
template <typename T,
typename StreamT = std::ostream,
typename = decltype(std::declval<T>().operator std::string()),
typename std::enable_if<!Can_output_directly<T, StreamT>::value, int>::type = 0>
std::string make_printable(const T& obj) {
std::cout << "[std::string make_printable(obj)]";
return (std::string)obj;
}
, Can_output_directly<T, StreamT>::value - false, .. .
source
share