62#elif defined(__GNUG__)
64 std::unique_ptr<char, void (*)(
void *)> result(
65 abi::__cxa_demangle(ti.name(),
nullptr,
nullptr, &status),
67 return (status == 0) ? result.get() : ti.name();
74 inline std::string
tiname(
const std::type_info &ti) {
78 inline std::wstring
wtiname(
const std::type_info &ti) {
80 return std::wstring(s.begin(), s.end());
83#ifndef CONSOLE_PLAIN_REPR
94 class Traits = std::char_traits<CharT>>
95 typename std::enable_if<
96 is_string<typename std::decay<T>::type>::value>::type
97 repr(T &&value, std::basic_ostream<CharT, Traits> &os = std::cout) {
113 class Traits = std::char_traits<CharT>>
114 typename std::enable_if<is_char<typename std::decay<T>::type>::value>::type
115 repr(T &&value, std::basic_ostream<CharT, Traits> &os = std::cout) {
131 class Traits = std::char_traits<CharT>>
132 typename std::enable_if<
133 std::is_same<typename std::decay<T>::type,
bool>::value>::type
134 repr(T &&value, std::basic_ostream<CharT, Traits> &os = std::cout) {
135 os << (value ?
"true" :
"false");
148 class Traits = std::char_traits<CharT>>
149 typename std::enable_if<
150 std::is_same<typename std::decay<T>::type, std::nullptr_t>::value>::type
151 repr(T &&, std::basic_ostream<CharT, Traits> &os = std::cout) {
164 template <
class CharT,
class Traits,
class Ret,
class... Args>
166 repr(Ret (*f)(Args...), std::basic_ostream<CharT, Traits> &os = std::cout) {
168 os <<
"<function at " << (
void *)f <<
'>';
184 class Traits = std::char_traits<CharT>>
185 typename std::enable_if<
186 !std::is_same<typename std::decay<T>::type,
bool>::value
187 && !std::is_same<typename std::decay<T>::type, std::nullptr_t>::value
188 && !is_string<typename std::decay<T>::type>::value
189 && !is_char<typename std::decay<T>::type>::value
190 && !std::is_function<typename std::remove_pointer<T>::type>::value
191 && is_basic_printable<CharT, Traits, typename std::decay<T>::type>::
193 repr(T &&value, std::basic_ostream<CharT, Traits> &os = std::cout) {
208 class Traits = std::char_traits<CharT>>
209 typename std::enable_if<
210 !std::is_same<typename std::decay<T>::type, std::nullptr_t>::value
211 && !is_string<typename std::decay<T>::type>::value
212 && !is_char<typename std::decay<T>::type>::value
213 && !is_basic_printable<CharT, Traits, typename std::decay<T>::type>::
215 repr(T &&value, std::basic_ostream<CharT, Traits> &os = std::cout) {
216 os <<
"<'" <<
tiname_impl(
typeid(
typename std::decay<T>::type))
217 <<
"' object at " << &value <<
'>';
222 class Traits = std::char_traits<CharT>>
223 void repr(std::reference_wrapper<T> v,
224 std::basic_ostream<CharT, Traits> &os = std::cout) {
231 class Traits = std::char_traits<CharT>>
232 void repr(T &&value, std::basic_ostream<CharT, Traits> &os = std::cout) {
233 os << std::forward<T>(value);
std::enable_if< is_string< typenamestd::decay< T >::type >::value >::type repr(T &&value, std::basic_ostream< CharT, Traits > &os=std::cout)
输出字符串类型(std::string, const char* 等)的表示,带双引号。
Definition repr.h:97
std::string tiname_impl(const std::type_info &ti)
获取类型信息的可读名称(跨平台 demangle),返回 std::string。
Definition repr.h:59
std::wstring wtiname(const std::type_info &ti)
tiname_impl 的 wchar_t 版。
Definition repr.h:78
std::string tiname(const std::type_info &ti)
tiname_impl 的 char 版别名。
Definition repr.h:74
void to_stream(char ch, std::basic_ostream< CharT, Traits > &os)
将 ch 输出到流。
Definition strpp.h:574
提供编译期类型特征检测(SFINAE 工具), 用于判断容器、可调用对象、迭代器、下标访问、字符串、可打印类型、字符类型等。