49 template <
typename... Args>
57 template <
class T,
class =
void>
63 void_t<decltype(std::begin(std::declval<T>())),
64 decltype(std::end(std::declval<T>()))>> : std::true_type {};
67 template <
class,
class =
void>
70 template <
class F,
class... Args>
72 void_t<decltype(std::declval<F>()(std::declval<Args>()...))>>
81 template <
class F,
class... Args>
89 template <
class T,
class =
void>
95 void_t<typename std::iterator_traits<T>::iterator_category>>
105 template <
class T,
class Idx,
class =
void>
109 template <
class T,
class Idx>
112 void_t<decltype(std::declval<T>()[std::declval<Idx>()])>>
122 template <
class T,
class =
void>
128 struct is_string<char *> : std::true_type {};
130 struct is_string<signed char *> : std::true_type {};
132 struct is_string<unsigned char *> : std::true_type {};
134 struct is_string<wchar_t *> : std::true_type {};
136 struct is_string<const char *> : std::true_type {};
138 struct is_string<const signed char *> : std::true_type {};
140 struct is_string<const unsigned char *> : std::true_type {};
142 struct is_string<const wchar_t *> : std::true_type {};
144 template <
class CharT,
class Traits,
class Alloc>
145 struct is_string<std::basic_string<CharT, Traits, Alloc>> : std::true_type {
148#if __cplusplus >= 201703L
149 template <
class CharT,
class Traits>
150 struct is_string<std::basic_string_view<CharT, Traits>> : std::true_type {};
159 template <
class T,
class =
void>
165 void_t<decltype(std::declval<std::ostream &>()
166 << std::declval<const T &>())>> : std::true_type {};
176 template <
class CharT,
class Traits,
class T,
class =
void>
180 template <
class CharT,
class Traits,
class T>
184 void_t<decltype(std::declval<std::basic_ostream<CharT, Traits> &>()
185 << std::declval<const T &>())>> : std::true_type {};
198 template <
class T,
class =
void>
199 struct is_char : std::false_type {};
204 struct is_char<char> : std::true_type {};
206 struct is_char<signed char> : std::true_type {};
208 struct is_char<unsigned char> : std::true_type {};
210 struct is_char<wchar_t> : std::true_type {};
219 template <
typename T,
typename =
void>
224 template <
typename T>
226 typename std::enable_if<std::is_integral<T>::value>::type> {
227 using type = std::uniform_int_distribution<T>;
231 template <
typename T>
233 typename std::enable_if<std::is_floating_point<T>::value>::type> {
234 using type = std::uniform_real_distribution<T>;
243 template <
class T,
class =
void>
249 void_t<std::is_same<decltype(std::declval<T>().done()), bool>,
250 decltype(std::declval<T>().current()),
251 decltype(std::declval<T>().advance()),
252 typename T::value_type>> : std::true_type {};
258 template <
class F,
class... Args>
260 typename std::enable_if<
is_callable<F, Args...>::value>::type;
265 template <
class F,
class... Args>
267 typename std::enable_if<!
is_callable<F, Args...>::value>::type;
274 typename std::enable_if<is_iterator<T>::value>::type;
281 typename std::enable_if<!is_iterator<T>::value>::type;
302 typename std::enable_if<is_printable<T>::value>::type;
309 typename std::enable_if<!is_printable<T>::value>::type;
328 template <
typename T>
336 typename std::enable_if<is_generator<T>::value>::type;
343 typename std::enable_if<!is_generator<T>::value>::type;
350 template <
class CharT,
class Traits,
class T>
354 typename std::decay<T>::type>::value>::type;
typename std::enable_if< is_basic_printable< CharT, Traits, typename std::decay< T >::type >::value >::type enable_if_basic_printable
启用若 T(decay 后)对给定字符流可打印。
Definition sfinae.h:350
typename uniform_distribution_impl< T >::type uniform_distribution_t
取得对印类型所对应的均匀分布。
Definition sfinae.h:328
typename std::enable_if<!is_printable< T >::value >::type enable_if_not_printable
启用若 T 不可打印。
Definition sfinae.h:307
typename std::enable_if< is_callable< F, Args... >::value >::type enable_if_callable
启用若 F 可以 Args... 参数调用。
Definition sfinae.h:258
is_basic_printable< wchar_t, std::char_traits< wchar_t >, T > is_w_printable
is_basic_printable<wchar_t, ...> 的简写。
Definition sfinae.h:190
typename std::enable_if< is_iterator< T >::value >::type enable_if_iterator
启用若 T 是迭代器。
Definition sfinae.h:272
typename std::enable_if< is_generator< T >::value >::type enable_if_generator
启用若 T 是生成器。
Definition sfinae.h:334
typename std::enable_if< is_string< typename std::decay< T >::type >::value >::type enable_if_string
启用若 T(decay 后)是字符串类型。
Definition sfinae.h:286
void void_t
C++11 兼容的 void_t 实现。
Definition sfinae.h:50
typename std::enable_if<!is_generator< T >::value >::type enable_if_not_generator
启用若 T 不是生成器。
Definition sfinae.h:341
typename std::enable_if< !is_char< typename std::decay< T >::type >::value >::type enable_if_not_char
启用若 T(decay 后)不是字符类型。
Definition sfinae.h:321
typename std::enable_if< is_char< typename std::decay< T >::type >::value >::type enable_if_char
启用若 T(decay 后)是字符类型。
Definition sfinae.h:314
typename std::enable_if<!is_callable< F, Args... >::value >::type enable_if_not_callable
启用若 F 不可以 Args... 参数调用。
Definition sfinae.h:265
is_callable_impl< F(Args...), void > is_callable
Definition sfinae.h:82
typename std::enable_if< !is_string< typename std::decay< T >::type >::value >::type enable_if_not_string
启用若 T(decay 后)不是字符串类型。
Definition sfinae.h:293
typename std::enable_if< is_printable< T >::value >::type enable_if_printable
启用若 T 可打印。
Definition sfinae.h:300
typename std::enable_if< is_w_printable< typename std::decay< T >::type >::value >::type enable_if_w_printable
启用若 T(decay 后)对 wchar_t 流可打印。
Definition sfinae.h:359
typename std::enable_if<!is_iterator< T >::value >::type enable_if_not_iterator
启用若 T 不是迭代器。
Definition sfinae.h:279
检测类型是否支持下标操作符(如 T[Idx])。
Definition sfinae.h:106
检测类型是否支持输出到指定字符类型的流(即定义了 operator<<)。
Definition sfinae.h:177
检测类型是否为字符类型(char、wchar_t 等)。
Definition sfinae.h:198
检测类型是否为容器(支持 std::begin 和 std::end)。
Definition sfinae.h:58
检测类型是否为生成器(具有 done()、current()、advance() 接口)。
Definition sfinae.h:243
检测类型是否为迭代器(具有 iterator_category)。
Definition sfinae.h:90
检测类型是否支持输出到 std::ostream(即定义了 operator<<)。
Definition sfinae.h:160
检测类型是否为字符串类型(char*、stdstring、std::string_view 等)。
Definition sfinae.h:123