\hypertarget{meta_2invoke_8h}{}\section{include/utl/meta/invoke.h File Reference} \label{meta_2invoke_8h}\index{include/utl/meta/invoke.\+h@{include/utl/meta/invoke.\+h}} {\ttfamily \#include $<$utl/core/impl.\+h$>$}\newline {\ttfamily \#include $<$utl/meta/integral.\+h$>$}\newline {\ttfamily \#include $<$utl/meta/detection.\+h$>$}\newline {\ttfamily \#include $<$utl/meta/operations.\+h$>$}\newline \subsection*{Classes} \begin{DoxyCompactItemize} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1identity}{utl\+::meta\+::identity$<$ \+\_\+\+Tp $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1wrap}{utl\+::meta\+::wrap$<$ F $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1wrap__i}{utl\+::meta\+::wrap\+\_\+i$<$ T, F $>$}} \begin{DoxyCompactList}\small\item\em Wrap a template {\ttfamily F} taking literal constants of type {\ttfamily T} into an Invokable. \end{DoxyCompactList}\item struct \mbox{\hyperlink{structutl_1_1meta_1_1detail_1_1is__applicable__}{utl\+::meta\+::detail\+::is\+\_\+applicable\+\_\+$<$ F, T $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1detail_1_1is__applicable__q__}{utl\+::meta\+::detail\+::is\+\_\+applicable\+\_\+q\+\_\+$<$ F, T $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1detail_1_1is__applicable__i__}{utl\+::meta\+::detail\+::is\+\_\+applicable\+\_\+i\+\_\+$<$ T, F, Is $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1detail_1_1defer__}{utl\+::meta\+::detail\+::defer\+\_\+$<$ F, Ts $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1detail_1_1defer__i__}{utl\+::meta\+::detail\+::defer\+\_\+i\+\_\+$<$ T, F, Is $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1quote}{utl\+::meta\+::quote$<$ F $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1quote__i}{utl\+::meta\+::quote\+\_\+i$<$ T, F $>$}} \begin{DoxyCompactList}\small\item\em Wrap a template {\ttfamily F} taking literal constants of type {\ttfamily T} into an Invokable. \end{DoxyCompactList}\item struct \mbox{\hyperlink{structutl_1_1meta_1_1detail_1_1compose__f__}{utl\+::meta\+::detail\+::compose\+\_\+f\+\_\+$<$ Fns $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1detail_1_1compose__f___3_01_fn0_00_01_fns_8_8_8_01_4}{utl\+::meta\+::detail\+::compose\+\_\+f\+\_\+$<$ Fn0, Fns... $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1detail_1_1compose__f___3_01_fn0_01_4}{utl\+::meta\+::detail\+::compose\+\_\+f\+\_\+$<$ Fn0 $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1detail_1_1compose__}{utl\+::meta\+::detail\+::compose\+\_\+$<$ Fns $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1detail_1_1compose___3_01_fn0_00_01_fns_8_8_8_01_4}{utl\+::meta\+::detail\+::compose\+\_\+$<$ Fn0, Fns... $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1detail_1_1compose___3_01_fn0_01_4}{utl\+::meta\+::detail\+::compose\+\_\+$<$ Fn0 $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1bind__front}{utl\+::meta\+::bind\+\_\+front$<$ Fn, Ts $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1bind__back}{utl\+::meta\+::bind\+\_\+back$<$ Fn, Ts $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1same__as}{utl\+::meta\+::same\+\_\+as$<$ T1 $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1same__as_1_1apply}{utl\+::meta\+::same\+\_\+as$<$ T1 $>$\+::apply$<$ T2 $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1not__same__as}{utl\+::meta\+::not\+\_\+same\+\_\+as$<$ T1 $>$}} \item struct \mbox{\hyperlink{structutl_1_1meta_1_1not__same__as_1_1apply}{utl\+::meta\+::not\+\_\+same\+\_\+as$<$ T1 $>$\+::apply$<$ T2 $>$}} \end{DoxyCompactItemize} \subsection*{Namespaces} \begin{DoxyCompactItemize} \item \mbox{\hyperlink{namespaceutl}{utl}} \begin{DoxyCompactList}\small\item\em S\+TL\textquotesingle{}s core language concepts. \end{DoxyCompactList}\item \mbox{\hyperlink{namespaceutl_1_1meta}{utl\+::meta}} \item \mbox{\hyperlink{namespaceutl_1_1meta_1_1detail}{utl\+::meta\+::detail}} \end{DoxyCompactItemize} \subsection*{Typedefs} \begin{Indent}\textbf{ meta\+:\+:invoke}\par {\em A meta-\/programming \mbox{\hyperlink{namespaceutl_adc675874b5426194d04112f76b356714}{invoke()}} analogous. A {\ttfamily meta\+::invocable} shall contain a nested template type named {\bfseries apply} which is bind to actual invocable meta-\/function. \begin{DoxyItemize} \item We can use {\ttfamily wrap$<$$>$} or even better {\ttfamily quote$<$$>$} in order to wrap a metafunction to a type (metafunction class) \item We can pass these wrapped types to other metafunctions \item We can {\ttfamily invoke$<$$>$} the inner {\ttfamily apply} from a wrapped metafunction class. \end{DoxyItemize}}\begin{DoxyCompactItemize} \item {\footnotesize template$<$typename \+\_\+\+Tp $>$ }\\using \mbox{\hyperlink{namespaceutl_1_1meta_a63c0b6b08f4c1d9bd3c4db7432e9b2af}{utl\+::meta\+::identity\+\_\+t}} = eval$<$ identity$<$ \+\_\+\+Tp $>$ $>$ \begin{DoxyCompactList}\small\item\em identity type alias \end{DoxyCompactList}\end{DoxyCompactItemize} \end{Indent} \textbf{ }\par \begin{DoxyCompactItemize} \item {\footnotesize template$<$typename Fn , typename... Args$>$ }\\using \mbox{\hyperlink{namespaceutl_1_1meta_a77630cd8adc01f7193f6cb834313d90f}{utl\+::meta\+::invoke}} = typename Fn\+::template apply$<$ Args... $>$ \item {\footnotesize template$<$typename Fn , typename... Args$>$ }\\using \mbox{\hyperlink{namespaceutl_1_1meta_ac27f3e5f3ec42921d9f8a6bb85560cf1}{utl\+::meta\+::invoke\+\_\+t}} = eval$<$ invoke$<$ Fn, Args... $>$ $>$ \end{DoxyCompactItemize} \textbf{ }\par \begin{DoxyCompactItemize} \item {\footnotesize template$<$template$<$ typename... $>$ class F, typename... T$>$ }\\using \mbox{\hyperlink{namespaceutl_1_1meta_a695a94a2bbe51b0d0eec9bf82214d094}{utl\+::meta\+::is\+\_\+applicable\+\_\+t}} = eval$<$ detail\+::is\+\_\+applicable\+\_\+$<$ F, T... $>$ $>$ \begin{DoxyCompactList}\small\item\em check if we can instantiate {\ttfamily F} with parameters {\ttfamily T} \end{DoxyCompactList}\item {\footnotesize template$<$typename Q , typename... T$>$ }\\using \mbox{\hyperlink{namespaceutl_1_1meta_a52c0afa73f63dc889e44cc6cc180f1f8}{utl\+::meta\+::is\+\_\+applicable\+\_\+qt}} = eval$<$ detail\+::is\+\_\+applicable\+\_\+q\+\_\+$<$ Q, T... $>$ $>$ \begin{DoxyCompactList}\small\item\em check if we can invoke {\ttfamily Q} with parameters {\ttfamily T} \end{DoxyCompactList}\item {\footnotesize template$<$typename T , template$<$ T... $>$ class F, T... Is$>$ }\\using \mbox{\hyperlink{namespaceutl_1_1meta_add602488265f07c7a3080355350cda70}{utl\+::meta\+::is\+\_\+applicable\+\_\+it}} = eval$<$ detail\+::is\+\_\+applicable\+\_\+i\+\_\+$<$ T, F, Is... $>$ $>$ \begin{DoxyCompactList}\small\item\em check if we can instantiate {\ttfamily F} with parameters {\ttfamily Is} of type {\ttfamily T} \end{DoxyCompactList}\end{DoxyCompactItemize} \textbf{ }\par \begin{DoxyCompactItemize} \item {\footnotesize template$<$template$<$ class... $>$ class F, class... Ts$>$ }\\using \mbox{\hyperlink{namespaceutl_1_1meta_a48f9a1220931596a9652351d2e7242be}{utl\+::meta\+::defer}} = if\+\_\+$<$ detail\+::is\+\_\+applicable\+\_\+$<$ F, Ts... $>$, detail\+::defer\+\_\+$<$ F, Ts... $>$, nil\+\_\+ $>$ \begin{DoxyCompactList}\small\item\em defer alias template for F$<$\+Ts...$>$ \end{DoxyCompactList}\item {\footnotesize template$<$typename T , template$<$ T... $>$ class F, T... Is$>$ }\\using \mbox{\hyperlink{namespaceutl_1_1meta_a01f183f337439e414184beedc9bcf9e3}{utl\+::meta\+::defer\+\_\+i}} = if\+\_\+$<$ detail\+::is\+\_\+applicable\+\_\+i\+\_\+$<$ T, F, Is... $>$, detail\+::defer\+\_\+i\+\_\+$<$ T, F, Is... $>$, nil\+\_\+ $>$ \begin{DoxyCompactList}\small\item\em defer\+\_\+i alias template for F$<$\+T, Is...$>$ \end{DoxyCompactList}\end{DoxyCompactItemize} \textbf{ }\par \begin{DoxyCompactItemize} \item {\footnotesize template$<$typename... Fns$>$ }\\using \mbox{\hyperlink{namespaceutl_1_1meta_a4f0c06cabe66bc73b703eb8509c7bb07}{utl\+::meta\+::compose}} = detail\+::compose\+\_\+$<$ Fns... $>$ \item {\footnotesize template$<$template$<$ typename... $>$ class... Fns$>$ }\\using \mbox{\hyperlink{namespaceutl_1_1meta_a729294327829b3068632da1235dc3090}{utl\+::meta\+::compose\+\_\+f}} = detail\+::compose\+\_\+f\+\_\+$<$ Fns... $>$ \end{DoxyCompactItemize}