|
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
- <meta http-equiv="X-UA-Compatible" content="IE=9"/>
- <meta name="generator" content="Doxygen 1.8.14"/>
- <meta name="viewport" content="width=device-width, initial-scale=1"/>
- <title>uTL: W:/Work/Software/Libraries/utl/include/utl/meta/detection.h</title>
- <link href="tabs.css" rel="stylesheet" type="text/css"/>
- <script type="text/javascript" src="jquery.js"></script>
- <script type="text/javascript" src="dynsections.js"></script>
- <link href="navtree.css" rel="stylesheet" type="text/css"/>
- <script type="text/javascript" src="resize.js"></script>
- <script type="text/javascript" src="navtreedata.js"></script>
- <script type="text/javascript" src="navtree.js"></script>
- <script type="text/javascript">
- /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
- $(document).ready(initResizable);
- /* @license-end */</script>
- <link href="search/search.css" rel="stylesheet" type="text/css"/>
- <script type="text/javascript" src="search/searchdata.js"></script>
- <script type="text/javascript" src="search/search.js"></script>
- <link href="doxygen.css" rel="stylesheet" type="text/css" />
- </head>
- <body>
- <div id="top"><!-- do not remove this div, it is closed by doxygen! -->
- <div id="titlearea">
- <table cellspacing="0" cellpadding="0">
- <tbody>
- <tr style="height: 56px;">
- <td id="projectalign" style="padding-left: 0.5em;">
- <div id="projectname">uTL
- </div>
- <div id="projectbrief">micro Template library</div>
- </td>
- </tr>
- </tbody>
- </table>
- </div>
- <!-- end header part -->
- <!-- Generated by Doxygen 1.8.14 -->
- <script type="text/javascript">
- /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
- var searchBox = new SearchBox("searchBox", "search",false,'Search');
- /* @license-end */
- </script>
- <script type="text/javascript" src="menudata.js"></script>
- <script type="text/javascript" src="menu.js"></script>
- <script type="text/javascript">
- /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
- $(function() {
- initMenu('',true,false,'search.php','Search');
- $(document).ready(function() { init_search(); });
- });
- /* @license-end */</script>
- <div id="main-nav"></div>
- </div><!-- top -->
- <div id="side-nav" class="ui-resizable side-nav-resizable">
- <div id="nav-tree">
- <div id="nav-tree-contents">
- <div id="nav-sync" class="sync"></div>
- </div>
- </div>
- <div id="splitbar" style="-moz-user-select:none;"
- class="ui-resizable-handle">
- </div>
- </div>
- <script type="text/javascript">
- /* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
- $(document).ready(function(){initNavTree('_w_1_2_work_2_software_2_libraries_2utl_2include_2utl_2meta_2detection_8h-example.html','');});
- /* @license-end */
- </script>
- <div id="doc-content">
- <!-- window showing the filter options -->
- <div id="MSearchSelectWindow"
- onmouseover="return searchBox.OnSearchSelectShow()"
- onmouseout="return searchBox.OnSearchSelectHide()"
- onkeydown="return searchBox.OnSearchSelectKey(event)">
- </div>
-
- <!-- iframe showing the search results (closed by default) -->
- <div id="MSearchResultsWindow">
- <iframe src="javascript:void(0)" frameborder="0"
- name="MSearchResults" id="MSearchResults">
- </iframe>
- </div>
-
- <div class="header">
- <div class="headertitle">
- <div class="title">W:/Work/Software/Libraries/utl/include/utl/meta/detection.h</div> </div>
- </div><!--header-->
- <div class="contents">
- <p>detection interface</p>
- <p>Checks if Op<Args...> is a valid expression without evaluating it.</p>
- <dl class="tparams"><dt>Template Parameters</dt><dd>
- <table class="tparams">
- <tr><td class="paramname">Op</td><td>a meta-callback function to pass Args... </td></tr>
- <tr><td class="paramname">Args...</td><td>types to pass to Op for checking </td></tr>
- </table>
- </dd>
- </dl>
- <dl class="section return"><dt>Returns</dt><dd>status of the operation [bool_] <ul>
- <li>true_ if Op<Args...> is valid expression </li>
- <li>false_ if Op<Args...> is not valid</li>
- </ul>
- <div class="fragment"><div class="line"><span class="comment">// archetypal alias for a copy assignment operation</span></div><div class="line"><span class="keyword">template</span>< <span class="keyword">class</span> T > <span class="keyword">using</span> copy_assign_t = decltype( declval<T&>() = declval<T const &>() );</div><div class="line"></div><div class="line"><span class="keyword">template</span>< <span class="keyword">class</span> T > <span class="keyword">using</span> is_copy_assignable = is_detected< copy_assign_t, T >;</div></div><!-- fragment --></dd></dl>
- <div class="fragment"><div class="line"></div><div class="line"><span class="preprocessor">#ifndef __utl_meta_detection_h__</span></div><div class="line"><span class="preprocessor">#define __utl_meta_detection_h__</span></div><div class="line"></div><div class="line"><span class="preprocessor">#include <<a class="code" href="impl_8h.html">utl/core/impl.h</a>></span></div><div class="line"><span class="preprocessor">#include <<a class="code" href="operations_8h.html">utl/meta/operations.h</a>></span></div><div class="line"><span class="preprocessor">#include <type_traits></span></div><div class="line"></div><div class="line"></div><div class="line"><span class="keyword">namespace </span><a class="code" href="namespaceutl.html">utl</a> {</div><div class="line"><span class="keyword">namespace </span>meta {</div><div class="line"></div><div class="line"><span class="preprocessor"> #if defined(UTL_WORKAROUND_CWG_1558)</span></div><div class="line"> <span class="keyword">template</span><<span class="keyword">typename</span>... _Ts></div><div class="line"> <span class="keyword">struct </span><a name="a0"></a><a class="code" href="group__detection.html#gac16d50de47cf57734433e9ea636522c5">void_</a> {</div><div class="line"> <span class="keyword">using</span> type = void;</div><div class="line"> };</div><div class="line"> <span class="keyword">template</span><<span class="keyword">typename</span>... _Ts></div><div class="line"> <span class="keyword">using</span> <a name="a1"></a><a class="code" href="group__detection.html#gae7373c997420d16cf37e542eb3cfa3ad">void_t</a> = <a name="a2"></a><a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a><<a class="code" href="group__detection.html#gac16d50de47cf57734433e9ea636522c5">void_</a><_Ts...>>;</div><div class="line"><span class="preprocessor"> #else</span></div><div class="line"> <span class="keyword">template</span> <<span class="keyword">typename</span>...> <span class="keyword">using</span> <a class="code" href="group__detection.html#gac16d50de47cf57734433e9ea636522c5">void_</a> = void;</div><div class="line"> <span class="keyword">template</span> <<span class="keyword">typename</span>...> <span class="keyword">using</span> <a class="code" href="group__detection.html#gae7373c997420d16cf37e542eb3cfa3ad">void_t</a> = void;</div><div class="line"><span class="preprocessor"> #endif</span></div><div class="line"></div><div class="line"> <span class="keyword">struct </span>nat_ {</div><div class="line"> nat_() = <span class="keyword">delete</span>;</div><div class="line"> ~nat_() = <span class="keyword">delete</span>;</div><div class="line"> nat_(nat_ <span class="keyword">const</span>&) = <span class="keyword">delete</span>;</div><div class="line"> <span class="keywordtype">void</span> operator = (nat_ <span class="keyword">const</span>&) = <span class="keyword">delete</span>;</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="keyword">namespace </span>detail {</div><div class="line"> <span class="keyword">template</span> <<span class="keyword">typename</span> Default,</div><div class="line"> <span class="keyword">typename</span> AlwaysVoid,</div><div class="line"> <span class="keyword">template</span><<span class="keyword">typename</span>...> <span class="keyword">class </span>Op, <span class="keyword">typename</span>... Args></div><div class="line"> <span class="keyword">struct </span>detector {</div><div class="line"> <span class="keyword">using</span> detected = <a name="a3"></a><a class="code" href="namespaceutl_1_1meta.html#a55511dbaa0adb605ce22dcec11f8d22d">false_</a>;</div><div class="line"> <span class="keyword">using</span> type = Default;</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="keyword">template</span> <<span class="keyword">typename</span> Default,</div><div class="line"> <span class="keyword">template</span><<span class="keyword">typename</span>...> <span class="keyword">class </span>Op, <span class="keyword">typename</span>... Args></div><div class="line"> <span class="keyword">struct </span>detector <Default, <a class="code" href="group__detection.html#gae7373c997420d16cf37e542eb3cfa3ad">void_t</a><Op<Args...>>, Op, Args...> {</div><div class="line"> <span class="keyword">using</span> detected = <a name="a4"></a><a class="code" href="namespaceutl_1_1meta.html#ae9a5a8fbe8202785f059935af219fb97">true_</a>;</div><div class="line"> <span class="keyword">using</span> type = Op<Args...>;</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="keyword">template</span> <<span class="keyword">typename</span> Default,</div><div class="line"> <span class="keyword">template</span><<span class="keyword">typename</span>...> <span class="keyword">class </span>Op, <span class="keyword">typename</span>... Args></div><div class="line"> <span class="keyword">using</span> <a name="a5"></a><a class="code" href="namespaceutl_1_1meta_1_1detail.html#a835827cb3116483228d6f7f774b68970">detected_or</a> = detector<Default, void, Op, Args...>;</div><div class="line"> } <span class="comment">// namespace detail</span></div><div class="line"><span class="comment"></span></div><div class="line"></div><div class="line"> <span class="keyword">template</span> <<span class="keyword">template</span><<span class="keyword">typename</span>...> <span class="keyword">class </span>Op, <span class="keyword">typename</span>... Args></div><div class="line"> <span class="keyword">using</span> <a name="a6"></a><a class="code" href="namespaceutl_1_1meta.html#a5329219a9d2f195421a78d8e07873507">is_detected</a> = <span class="keyword">typename</span> detail::detector<nat_, void, Op, Args...>::detected;</div><div class="line"></div><div class="line"> <span class="keyword">template</span>< <span class="keyword">template</span><<span class="keyword">typename</span>...> <span class="keyword">class </span>Op, <span class="keyword">typename</span>... Args></div><div class="line"> constexpr <span class="keywordtype">bool</span> <a name="a7"></a><a class="code" href="namespaceutl_1_1meta.html#a4f3184ccb8e8ba2a78e2d2e83a0b9885">is_detected_v</a> = <a class="code" href="namespaceutl_1_1meta.html#a5329219a9d2f195421a78d8e07873507">is_detected</a><Op, Args...>::value;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> <<span class="keyword">template</span><<span class="keyword">typename</span>...> <span class="keyword">class </span>Op, <span class="keyword">typename</span>... Args></div><div class="line"> <span class="keyword">using</span> <a name="a8"></a><a class="code" href="namespaceutl_1_1meta.html#aa654a286b3bc8e6d8116ee1f57087110">detected_t</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a> <</div><div class="line"> detail::detector<nat_, void, Op, Args...></div><div class="line"> >;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> <<span class="keyword">typename</span> Default,</div><div class="line"> <span class="keyword">template</span><<span class="keyword">typename</span>...> <span class="keyword">class </span>Op, <span class="keyword">typename</span>... Args></div><div class="line"> <span class="keyword">using</span> <a name="a9"></a><a class="code" href="namespaceutl_1_1meta.html#a8fd055bc6c6c3b1d551e9605aa35644c">detected_or_t</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a> <</div><div class="line"> <a class="code" href="namespaceutl_1_1meta_1_1detail.html#a835827cb3116483228d6f7f774b68970">detail::detected_or</a><Default, Op, Args...></div><div class="line"> >;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> <<span class="keyword">typename</span> Expected,</div><div class="line"> <span class="keyword">template</span><<span class="keyword">typename</span>...> <span class="keyword">class </span>Op, <span class="keyword">typename</span>... Args ></div><div class="line"> <span class="keyword">using</span> <a name="a10"></a><a class="code" href="namespaceutl_1_1meta.html#ad5224ef66e8f40efaaf3ad3d605dd629">is_detected_exact</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a> <</div><div class="line"> same_<Expected, <a class="code" href="namespaceutl_1_1meta.html#aa654a286b3bc8e6d8116ee1f57087110">detected_t</a><Op, Args...>></div><div class="line"> >;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> <<span class="keyword">typename</span> Expected,</div><div class="line"> <span class="keyword">template</span><<span class="keyword">typename</span>...> <span class="keyword">class </span>Op, <span class="keyword">typename</span>... Args ></div><div class="line"> constexpr <span class="keywordtype">bool</span> <a name="a11"></a><a class="code" href="namespaceutl_1_1meta.html#a960827a1d72083a511f8ea4ccc8beceb">is_detected_exact_v</a> = <a class="code" href="namespaceutl_1_1meta.html#ad5224ef66e8f40efaaf3ad3d605dd629">is_detected_exact</a>< Expected, Op, Args...>::value;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> <<span class="keyword">typename</span> To,</div><div class="line"> <span class="keyword">template</span><<span class="keyword">typename</span>...> <span class="keyword">class </span>Op, <span class="keyword">typename</span>... Args ></div><div class="line"> <span class="keyword">using</span> <a name="a12"></a><a class="code" href="namespaceutl_1_1meta.html#afa24702fa15a1d0a8a05761c54b79def">is_detected_convertible</a> = <a class="code" href="namespaceutl_1_1meta.html#aa5a37adba244ff4286f994111c4c02ea">eval</a> <</div><div class="line"> std::is_convertible< <a class="code" href="namespaceutl_1_1meta.html#aa654a286b3bc8e6d8116ee1f57087110">detected_t</a><Op, Args...>, To ></div><div class="line"> >;</div><div class="line"></div><div class="line"> <span class="keyword">template</span> <<span class="keyword">typename</span> To,</div><div class="line"> <span class="keyword">template</span><<span class="keyword">typename</span>...> <span class="keyword">class </span>Op, <span class="keyword">typename</span>... Args ></div><div class="line"> constexpr <span class="keywordtype">bool</span> <a name="a13"></a><a class="code" href="namespaceutl_1_1meta.html#acba521b528e775be4b37d2e481e0f138">is_detected_convertible_v</a> =</div><div class="line"> <a class="code" href="namespaceutl_1_1meta.html#afa24702fa15a1d0a8a05761c54b79def">is_detected_convertible</a><To, Op, Args...>::value;</div><div class="line"></div><div class="line">}}</div><div class="line"></div><div class="line"><span class="preprocessor">#endif </span><span class="comment">/* __utl_meta_detection_h__ */</span><span class="preprocessor"></span></div></div><!-- fragment --> </div><!-- contents -->
- </div><!-- doc-content -->
- <!-- start footer part -->
- <div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
- <ul>
- <li class="footer">Generated by
- <a href="http://www.doxygen.org/index.html">
- <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.14 </li>
- </ul>
- </div>
- </body>
- </html>
|