Turi Create  4.0
is_detected.hpp
1 /* Copyright © 2020 Apple Inc. All rights reserved.
2  *
3  * Use of this source code is governed by a BSD-3-clause license that can
4  * be found in the LICENSE.txt file or at https://opensource.org/licenses/BSD-3-Clause
5  */
6 
7 #pragma once
8 
9 #if __cplusplus > 201103L
10 
11 #include <experimental/type_traits>
12 
13 #else
14 
15 // this is a C++11 implementation for std::experimental::detail (see online cppreference
16 // for full details).
17 //
18 // this enables static interface testing for the presence of functions and methods.
19 //
20 // impl reference: https://people.eecs.berkeley.edu/~brock/blog/detection_idiom.php
21 
22 namespace std {
23 
24 template <class...>
25 using void_t = void;
26 
27 namespace experimental {
28 struct nonesuch {
29  ~nonesuch() = delete;
30  nonesuch(nonesuch const&) = delete;
31  void operator=(nonesuch const&) = delete;
32 };
33 
34 namespace detail {
35 template <class Default, class AlwaysVoid, template <class...> class Op, class... Args>
36 struct detector {
37  using value_t = std::false_type;
38  using type = Default;
39 };
40 
41 template <class Default, template <class...> class Op, class... Args>
42 struct detector<Default, std::void_t<Op<Args...> >, Op, Args...> {
43  using value_t = std::true_type;
44  using type = Op<Args...>;
45 };
46 
47 } // namespace detail
48 
49 template <template <class...> class Op, class... Args>
50 using is_detected = typename detail::detector<nonesuch, void, Op, Args...>::value_t;
51 
52 } // namespace experimental
53 } // namespace std
54 
55 #endif
STL namespace.