\hypertarget{traits_8h}{}\doxysection{kblib/traits.h File Reference}
\label{traits_8h}\index{kblib/traits.h@{kblib/traits.h}}


Contains some type traits not in the standard library that are useful in the implementation of kblib.  


{\ttfamily \#include \char`\"{}fakestd.\+h\char`\"{}}\newline
{\ttfamily \#include \char`\"{}tdecl.\+h\char`\"{}}\newline
{\ttfamily \#include $<$array$>$}\newline
{\ttfamily \#include $<$cstring$>$}\newline
{\ttfamily \#include $<$tuple$>$}\newline
{\ttfamily \#include $<$type\+\_\+traits$>$}\newline
Include dependency graph for traits.\+h\+:\nopagebreak
\begin{figure}[H]
\begin{center}
\leavevmode
\includegraphics[width=350pt]{traits_8h__incl}
\end{center}
\end{figure}
This graph shows which files directly or indirectly include this file\+:\nopagebreak
\begin{figure}[H]
\begin{center}
\leavevmode
\includegraphics[width=350pt]{traits_8h__dep__incl}
\end{center}
\end{figure}
\doxysubsection*{Classes}
\begin{DoxyCompactItemize}
\item 
struct \mbox{\hyperlink{structkblib_1_1contains__type_3_01std_1_1tuple_3_01_t_00_01_ts_8_8_8_01_4_00_01_u_01_4}{kblib\+::contains\+\_\+type$<$ std\+::tuple$<$ T, Ts... $>$, U $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1contains__type_3_01std_1_1tuple_3_01_t_00_01_ts_8_8_8_01_4_00_01_t_01_4}{kblib\+::contains\+\_\+type$<$ std\+::tuple$<$ T, Ts... $>$, T $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1contains__type_3_01std_1_1tuple_3_4_00_01_t_01_4}{kblib\+::contains\+\_\+type$<$ std\+::tuple$<$$>$, T $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1contains__types_3_01_tuple_00_01std_1_1tuple_3_01_t_00_01_ts_8_8_8_01_4_01_4}{kblib\+::contains\+\_\+types$<$ Tuple, std\+::tuple$<$ T, Ts... $>$ $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1contains__types_3_01_tuple_00_01std_1_1tuple_3_4_01_4}{kblib\+::contains\+\_\+types$<$ Tuple, std\+::tuple$<$$>$ $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1list__as__tuple_3_01_tuple_3_01_ts_8_8_8_01_4_01_4}{kblib\+::list\+\_\+as\+\_\+tuple$<$ Tuple$<$ Ts... $>$ $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__unbounded__array}{kblib\+::is\+\_\+unbounded\+\_\+array$<$ T $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__unbounded__array_3_01_t_0f_0e_4}{kblib\+::is\+\_\+unbounded\+\_\+array$<$ T\mbox{[}$\,$\mbox{]}$>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__bounded__array}{kblib\+::is\+\_\+bounded\+\_\+array$<$ T $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__bounded__array_3_01_t_0f_n_0e_4}{kblib\+::is\+\_\+bounded\+\_\+array$<$ T\mbox{[}\+N\mbox{]}$>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1ignore}{kblib\+::ignore$<$ typename, T $>$}}
\begin{DoxyCompactList}\small\item\em Ignores its first template argument entirely, and returns its second. \end{DoxyCompactList}\item 
struct \mbox{\hyperlink{structkblib_1_1is__resizable}{kblib\+::is\+\_\+resizable$<$ C $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1has__reserve}{kblib\+::has\+\_\+reserve$<$ C $>$}}
\begin{DoxyCompactList}\small\item\em True if and only if C contains an accessible reserve() member. \end{DoxyCompactList}\item 
struct \mbox{\hyperlink{structkblib_1_1is__contiguous}{kblib\+::is\+\_\+contiguous$<$ C $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1class__of_3_01_m_01_t_1_1_5_01_4}{kblib\+::class\+\_\+of$<$ M T\+::$\ast$ $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1member__of_3_01_m_01_t_1_1_5_01_4}{kblib\+::member\+\_\+of$<$ M T\+::$\ast$ $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1return__type_3_01_r_07_args_8_8_8_08_4}{kblib\+::return\+\_\+type$<$ R(\+Args...)$>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1return__type_3_01_r_07_args_8_8_8_08_01const_01_4}{kblib\+::return\+\_\+type$<$ R(\+Args...) const $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1return__type_3_01_r_07_args_8_8_8_08_01volatile_01_4}{kblib\+::return\+\_\+type$<$ R(\+Args...) volatile $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1return__type_3_01_r_07_args_8_8_8_08_01const_01volatile_01_4}{kblib\+::return\+\_\+type$<$ R(\+Args...) const volatile $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1exists}{kblib\+::exists$<$ T $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__input__iterator}{kblib\+::is\+\_\+input\+\_\+iterator$<$ T, typename $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__input__iterator_3_01_t_00_01void__if__t_3_01std_1_1is__base__of_3_01std_1_1in234768fad8d9bb60c694b1d9d96c2c0c}{kblib\+::is\+\_\+input\+\_\+iterator$<$ T, void\+\_\+if\+\_\+t$<$ std\+::is\+\_\+base\+\_\+of$<$ std\+::input\+\_\+iterator\+\_\+tag, typename std\+::iterator\+\_\+traits$<$ T $>$\+::iterator\+\_\+category $>$\+::value $>$ $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__forward__iterator}{kblib\+::is\+\_\+forward\+\_\+iterator$<$ T, typename $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__forward__iterator_3_01_t_00_01void__if__t_3_01std_1_1is__base__of_3_01std_1_1123504ca44604c4d631a64f1c696432e}{kblib\+::is\+\_\+forward\+\_\+iterator$<$ T, void\+\_\+if\+\_\+t$<$ std\+::is\+\_\+base\+\_\+of$<$ std\+::forward\+\_\+iterator\+\_\+tag, typename std\+::iterator\+\_\+traits$<$ T $>$\+::iterator\+\_\+category $>$\+::value $>$ $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__bidirectional__iterator}{kblib\+::is\+\_\+bidirectional\+\_\+iterator$<$ T, typename $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__bidirectional__iterator_3_01_t_00_01void__if__t_3_01std_1_1is__base__of_3_01sa49b8d252b80c33e3e8c1f1cd38ed80a}{kblib\+::is\+\_\+bidirectional\+\_\+iterator$<$ T, void\+\_\+if\+\_\+t$<$ std\+::is\+\_\+base\+\_\+of$<$ std\+::bidirectional\+\_\+iterator\+\_\+tag, typename std\+::iterator\+\_\+traits$<$ T $>$\+::iterator\+\_\+category $>$\+::value $>$ $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__random__access__iterator}{kblib\+::is\+\_\+random\+\_\+access\+\_\+iterator$<$ T, typename $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__random__access__iterator_3_01_t_00_01void__if__t_3_01std_1_1is__base__of_3_0176e99d6e82616d065cc522966db7e3ec}{kblib\+::is\+\_\+random\+\_\+access\+\_\+iterator$<$ T, void\+\_\+if\+\_\+t$<$ std\+::is\+\_\+base\+\_\+of$<$ std\+::random\+\_\+access\+\_\+iterator\+\_\+tag, typename std\+::iterator\+\_\+traits$<$ T $>$\+::iterator\+\_\+category $>$\+::value $>$ $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1iterator__type__for_3_01_t_0f_n_0e_00_01void_01_4}{kblib\+::iterator\+\_\+type\+\_\+for$<$ T\mbox{[}\+N\mbox{]}, void $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1iterator__type__for_3_01_range_00_01void__t_3_01decltype_07begin_07std_1_1declval1101c10852428ba517f2e2551d7e07be}{kblib\+::iterator\+\_\+type\+\_\+for$<$ Range, void\+\_\+t$<$ decltype(begin(std\+::declval$<$ Range \& $>$()))$>$ $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__iterable}{kblib\+::is\+\_\+iterable$<$ Range, typename $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__iterable_3_01_range_00_01void__if__t_3_01is__input__iterator_3_01decltype_07b2bc8ae14696a5d961b6b820839a016a5}{kblib\+::is\+\_\+iterable$<$ Range, void\+\_\+if\+\_\+t$<$ is\+\_\+input\+\_\+iterator$<$ decltype(begin(std\+::declval$<$ Range \& $>$()))$>$\+::value $>$ $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__iterable_3_01_t_0f_n_0e_00_01void_01_4}{kblib\+::is\+\_\+iterable$<$ T\mbox{[}\+N\mbox{]}, void $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__iterable_3_01_t_07_6_08_0f_n_0e_00_01void_01_4}{kblib\+::is\+\_\+iterable$<$ T(\&)\mbox{[}\+N\mbox{]}, void $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__iterator}{kblib\+::is\+\_\+iterator$<$ T, typename $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__iterator_3_01_t_00_01void__t_3_01decltype_07_5std_1_1declval_3_01_t_01_6_01_417754e2a59262d22e4830b1d5c55d7cc}{kblib\+::is\+\_\+iterator$<$ T, void\+\_\+t$<$ decltype($\ast$std\+::declval$<$ T \& $>$(), void(),++std\+::declval$<$ T \& $>$())$>$ $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1type__constant}{kblib\+::type\+\_\+constant$<$ T, V $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__aliasing__type}{kblib\+::is\+\_\+aliasing\+\_\+type$<$ T $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__aliasing__type_3_01char_01_4}{kblib\+::is\+\_\+aliasing\+\_\+type$<$ char $>$}}
\item 
struct \mbox{\hyperlink{structkblib_1_1is__aliasing__type_3_01unsigned_01char_01_4}{kblib\+::is\+\_\+aliasing\+\_\+type$<$ unsigned char $>$}}
\end{DoxyCompactItemize}
\doxysubsection*{Namespaces}
\begin{DoxyCompactItemize}
\item 
namespace \mbox{\hyperlink{namespacekblib}{kblib}}
\begin{DoxyCompactList}\small\item\em The main namespace in which all entities from kblib are defined. \end{DoxyCompactList}\item 
namespace \mbox{\hyperlink{namespacekblib_1_1detail}{kblib\+::detail}}
\begin{DoxyCompactList}\small\item\em The namespace used for implementation details within kblib. \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsection*{Typedefs}
\begin{DoxyCompactItemize}
\item 
{\footnotesize template$<$typename T $>$ }\\using \mbox{\hyperlink{namespacekblib_a8fe1791c4dfe674d145963ab5b3121ae}{kblib\+::alias}} = T
\begin{DoxyCompactList}\small\item\em A simple identity alias for simplifying some compound type declarations, such as function pointers. \end{DoxyCompactList}\item 
{\footnotesize template$<$typename U , typename T $>$ }\\using \mbox{\hyperlink{namespacekblib_a3cec35675700d7e15c9139e0497768e6}{kblib\+::ignore\+\_\+t}} = typename ignore$<$ U, T $>$\+::type
\begin{DoxyCompactList}\small\item\em An alias for \mbox{\hyperlink{structkblib_1_1ignore_aa8afaf19eb6bad07fa899e99a05e845a}{ignore$<$\+U, T$>$\+::type}}. \end{DoxyCompactList}\item 
{\footnotesize template$<$typename T $>$ }\\using \mbox{\hyperlink{namespacekblib_ac0d673e8dfabd5fe1fe4d89a08be7019}{kblib\+::class\+\_\+of\+\_\+t}} = typename class\+\_\+of$<$ T $>$\+::type
\item 
{\footnotesize template$<$typename T $>$ }\\using \mbox{\hyperlink{namespacekblib_a8944b438ec39c111c64a1e8501fd7828}{kblib\+::member\+\_\+of\+\_\+t}} = typename member\+\_\+of$<$ T $>$\+::type
\item 
{\footnotesize template$<$typename Range $>$ }\\using \mbox{\hyperlink{namespacekblib_a50228da6d1f395258a03db48257305d0}{kblib\+::iterator\+\_\+type\+\_\+for\+\_\+t}} = typename iterator\+\_\+type\+\_\+for$<$ Range $>$\+::type
\item 
{\footnotesize template$<$typename T $>$ }\\using \mbox{\hyperlink{namespacekblib_a4be602e9cbe25a984f76f7a66a0466cd}{kblib\+::remove\+\_\+reference\+\_\+t}} = typename std\+::remove\+\_\+reference$<$ T $>$\+::type
\begin{DoxyCompactList}\small\item\em Abbreviated name for std\+::remove\+\_\+reference$<$\+T$>$\+::type for C++14. \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsection*{Functions}
\begin{DoxyCompactItemize}
\item 
{\footnotesize template$<$typename T , int N, int... I$>$ }\\constexpr auto \mbox{\hyperlink{namespacekblib_1_1detail_a8e69943e2b7ab538494374e097321357}{kblib\+::detail\+::trim\+\_\+array}} (const T(\&arr)\mbox{[}N\mbox{]}, std\+::integer\+\_\+sequence$<$ int, I... $>$) -\/$>$ std\+::array$<$ T, std\+::integer\+\_\+sequence$<$ int, I... $>$\+::size()$>$
\begin{DoxyCompactList}\small\item\em Truncates an array to its first N elements. \end{DoxyCompactList}\item 
{\footnotesize template$<$int trim, typename T , int N, typename Indices  = std\+::make\+\_\+integer\+\_\+sequence$<$int, N -\/ trim$>$$>$ }\\constexpr auto \mbox{\hyperlink{namespacekblib_a07019c995e0508ce266be47f94f3a882}{kblib\+::trim\+\_\+array}} (const T(\&arr)\mbox{[}N\mbox{]}) -\/$>$ std\+::array$<$ T, N -\/ trim $>$
\begin{DoxyCompactList}\small\item\em Truncates the last trim elements from an array. \end{DoxyCompactList}\item 
{\footnotesize template$<$int N, typename Indices  = std\+::make\+\_\+integer\+\_\+sequence$<$int, N -\/ 1$>$$>$ }\\constexpr auto \mbox{\hyperlink{namespacekblib_a9bfc51ee4b1118cf5effed3d4ae9dfed}{kblib\+::remove\+\_\+null\+\_\+terminator}} (const char(\&arr)\mbox{[}N\mbox{]}) -\/$>$ std\+::array$<$ char, N -\/ 1 $>$
\begin{DoxyCompactList}\small\item\em Creates an array of only the meaningful characters in a string literal, and not the null terminator. \end{DoxyCompactList}\item 
{\footnotesize template$<$typename T , typename F $>$ }\\auto \mbox{\hyperlink{namespacekblib_ae5b7fdf2bbba96527afa217fad0dea1f}{kblib\+::byte\+\_\+cast}} (F v) noexcept -\/$>$ T
\begin{DoxyCompactList}\small\item\em Creates a T with the same object representation as the given F. \end{DoxyCompactList}\item 
{\footnotesize template$<$typename C , typename  = decltype(std\+::declval$<$\+C\&$>$().\+resize(0))$>$ }\\auto \mbox{\hyperlink{namespacekblib_1_1detail_ac5dbc22e701244360a7107a086f67d3c}{kblib\+::detail\+::calc\+\_\+resizable}} (int) noexcept -\/$>$ std\+::true\+\_\+type
\item 
{\footnotesize template$<$typename $>$ }\\auto \mbox{\hyperlink{namespacekblib_1_1detail_ac6e7201044196c9c8314f7f6c3a2f168}{kblib\+::detail\+::calc\+\_\+resizable}} (...) noexcept -\/$>$ std\+::false\+\_\+type
\item 
{\footnotesize template$<$typename C , typename std\+::enable\+\_\+if$<$ has\+\_\+reserve\+\_\+v$<$ C $>$, int $>$\+::type  = 0$>$ }\\auto \mbox{\hyperlink{namespacekblib_a7035cf97e9bcba5add3b1462ac01a0ed}{kblib\+::try\+\_\+reserve}} (C \&c, std\+::size\+\_\+t s) noexcept(noexcept(c.\+reserve(s))) -\/$>$ void
\begin{DoxyCompactList}\small\item\em Attempt to reserve capacity in a container. No-\/op if unsupported. \end{DoxyCompactList}\end{DoxyCompactItemize}
\doxysubsection*{Variables}
\begin{DoxyCompactItemize}
\item 
{\footnotesize template$<$typename... Ts$>$ }\\\mbox{\hyperlink{tdecl_8h_a9b2376bf15765fad0ad95e4aecf36e87}{KBLIB\+\_\+\+CONSTANT\+\_\+V}} \mbox{\hyperlink{namespacekblib_a462a4f145e951b0820c78d27c60d7389}{kblib\+::contains\+\_\+type\+\_\+v}} = contains\+\_\+type$<$Ts...$>$\+::value
\item 
{\footnotesize template$<$typename... Ts$>$ }\\\mbox{\hyperlink{tdecl_8h_a9b2376bf15765fad0ad95e4aecf36e87}{KBLIB\+\_\+\+CONSTANT\+\_\+V}} \mbox{\hyperlink{namespacekblib_a7bf6ffaec25cb2430dcd6f43bd285ca4}{kblib\+::contains\+\_\+types\+\_\+v}} = contains\+\_\+types$<$Ts...$>$\+::value
\item 
{\footnotesize template$<$typename C $>$ }\\\mbox{\hyperlink{tdecl_8h_a9b2376bf15765fad0ad95e4aecf36e87}{KBLIB\+\_\+\+CONSTANT\+\_\+V}} \mbox{\hyperlink{namespacekblib_a928b1f231946db62ee4c171a21593919}{kblib\+::is\+\_\+resizable\+\_\+v}} = decltype(detail\+::calc\+\_\+resizable$<$C$>$(0))\+::value
\item 
{\footnotesize template$<$typename C , typename  = void$>$ }\\\mbox{\hyperlink{tdecl_8h_a9b2376bf15765fad0ad95e4aecf36e87}{KBLIB\+\_\+\+CONSTANT\+\_\+V}} \mbox{\hyperlink{namespacekblib_ad122336bc521ea4a22d7759b529fb561}{kblib\+::has\+\_\+reserve\+\_\+v}} = false
\item 
{\footnotesize template$<$typename C , typename  = void$>$ }\\\mbox{\hyperlink{tdecl_8h_a9b2376bf15765fad0ad95e4aecf36e87}{KBLIB\+\_\+\+CONSTANT\+\_\+V}} \mbox{\hyperlink{namespacekblib_acec974f6a75e6884147ef326bbd78d35}{kblib\+::is\+\_\+contiguous\+\_\+v}} = false
\begin{DoxyCompactList}\small\item\em Type trait to determine if a container is contiguous. \end{DoxyCompactList}\item 
{\footnotesize template$<$typename T $>$ }\\\mbox{\hyperlink{tdecl_8h_a9b2376bf15765fad0ad95e4aecf36e87}{KBLIB\+\_\+\+CONSTANT\+\_\+V}} \mbox{\hyperlink{namespacekblib_a38ad8c5b263ac766baf7ec36fe3b4a10}{kblib\+::is\+\_\+input\+\_\+iterator\+\_\+v}} = is\+\_\+input\+\_\+iterator$<$T$>$\+::value
\item 
{\footnotesize template$<$typename T $>$ }\\\mbox{\hyperlink{tdecl_8h_a9b2376bf15765fad0ad95e4aecf36e87}{KBLIB\+\_\+\+CONSTANT\+\_\+V}} \mbox{\hyperlink{namespacekblib_a8bde12b9b9ad4463f4cc065fd2df6f99}{kblib\+::is\+\_\+forward\+\_\+iterator\+\_\+v}} = is\+\_\+forward\+\_\+iterator$<$T$>$\+::value
\item 
{\footnotesize template$<$typename T $>$ }\\\mbox{\hyperlink{tdecl_8h_a9b2376bf15765fad0ad95e4aecf36e87}{KBLIB\+\_\+\+CONSTANT\+\_\+V}} \mbox{\hyperlink{namespacekblib_ab4a90d7f7bacba9a52aea362f42af35f}{kblib\+::is\+\_\+bidirectional\+\_\+iterator\+\_\+v}} = is\+\_\+bidirectional\+\_\+iterator$<$T$>$\+::value
\item 
{\footnotesize template$<$typename T $>$ }\\\mbox{\hyperlink{tdecl_8h_a9b2376bf15765fad0ad95e4aecf36e87}{KBLIB\+\_\+\+CONSTANT\+\_\+V}} \mbox{\hyperlink{namespacekblib_a9f3169b47a686b2f29f36d4419530960}{kblib\+::is\+\_\+random\+\_\+access\+\_\+iterator\+\_\+v}} = is\+\_\+random\+\_\+access\+\_\+iterator$<$T$>$\+::value
\item 
{\footnotesize template$<$typename T $>$ }\\\mbox{\hyperlink{tdecl_8h_a9b2376bf15765fad0ad95e4aecf36e87}{KBLIB\+\_\+\+CONSTANT\+\_\+V}} \mbox{\hyperlink{namespacekblib_a47c378eaff6fdce8aa2eaafe18eb1356}{kblib\+::is\+\_\+iterable\+\_\+v}} = is\+\_\+iterable$<$T$>$\+::value
\item 
{\footnotesize template$<$typename T $>$ }\\\mbox{\hyperlink{tdecl_8h_a9b2376bf15765fad0ad95e4aecf36e87}{KBLIB\+\_\+\+CONSTANT\+\_\+V}} \mbox{\hyperlink{namespacekblib_a77a4b828d16a122e5fd65379109dc036}{kblib\+::is\+\_\+iterator\+\_\+v}} = is\+\_\+iterator$<$T$>$\+::value
\item 
{\footnotesize template$<$typename T $>$ }\\\mbox{\hyperlink{tdecl_8h_a9b2376bf15765fad0ad95e4aecf36e87}{KBLIB\+\_\+\+CONSTANT\+\_\+V}} \mbox{\hyperlink{namespacekblib_a625498ea158a89d47216df312843feac}{kblib\+::is\+\_\+reference\+\_\+v}} = std\+::is\+\_\+reference$<$T$>$\+::value
\begin{DoxyCompactList}\small\item\em Abbreviated name for std\+::is\+\_\+reference$<$\+T$>$\+::value for C++14. \end{DoxyCompactList}\item 
{\footnotesize template$<$typename CharT  = char$>$ }\\\mbox{\hyperlink{tdecl_8h_a35b356d58929dd3ae764e8291838f5be}{KBLIB\+\_\+\+CONSTANT}} auto \mbox{\hyperlink{namespacekblib_af23ee1a0fd16161a62159681c8cf6e16}{kblib\+::eof}} = std\+::char\+\_\+traits$<$CharT$>$\+::eof()
\begin{DoxyCompactList}\small\item\em Names the EOF value for the given character type in std\+::char\+\_\+traits. \end{DoxyCompactList}\item 
{\footnotesize template$<$typename T $>$ }\\\mbox{\hyperlink{tdecl_8h_a9b2376bf15765fad0ad95e4aecf36e87}{KBLIB\+\_\+\+CONSTANT\+\_\+V}} \mbox{\hyperlink{namespacekblib_aa9f553215f3b18343f6b298506426ce2}{kblib\+::is\+\_\+aliasing\+\_\+type\+\_\+v}} = is\+\_\+aliasing\+\_\+type$<$T$>$\+::value
\end{DoxyCompactItemize}


\doxysubsection{Detailed Description}
Contains some type traits not in the standard library that are useful in the implementation of kblib. 

\begin{DoxyAuthor}{Author}
killerbee 
\end{DoxyAuthor}
\begin{DoxyDate}{Date}
2019-\/2021 
\end{DoxyDate}
\begin{DoxyCopyright}{Copyright}
GNU General Public Licence v3.\+0 
\end{DoxyCopyright}


Definition in file \mbox{\hyperlink{traits_8h_source}{traits.\+h}}.

