The Gaudi Framework  v30r3 (a5ef0a68)
detected.h
Go to the documentation of this file.
1 #ifndef DETECTED_H
2 #define DETECTED_H
3 // implementation of Library Fundamentals TS V2 detected idiom,
4 // taken from http://en.cppreference.com/w/cpp/experimental/is_detected
5 // and http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4436.pdf
6 
7 #include <type_traits>
8 
9 namespace Gaudi
10 {
11  namespace cpp17
12  {
13  namespace details
14  {
15  template <typename...>
16  struct void_t_ {
17  using type = void;
18  };
19  template <typename... T>
20  using void_t = typename void_t_<T...>::type;
21 
23  template <typename Default, typename AlwaysVoid, template <typename...> class Op, typename... Args>
24  struct detector {
25  constexpr static bool value = false;
26  using type = Default;
28  };
29 
31  template <typename Default, template <typename...> class Op, typename... Args>
32  struct detector<Default, void_t<Op<Args...>>, Op, Args...> {
33  constexpr static bool value = true;
34  using type = Op<Args...>;
36  };
37  }
38 
39  template <template <class...> class Op, class... Args>
40  using is_detected = details::detector<void, void, Op, Args...>;
41 
42  template <template <class...> class Op, class... Args>
43  using detected_t = typename is_detected<Op, Args...>::type;
44 
45  // Op<Args...> if that is a valid type, otherwise Default.
46  template <typename Default, template <typename...> class Op, typename... Args>
47  using detected_or_t = typename details::detector<Default, void, Op, Args...>::type;
48  }
49 }
50 
51 #endif
typename is_detected< Op, Args... >::type detected_t
Definition: detected.h:43
typename void_t_< T... >::type void_t
Definition: detected.h:20
class MergingTransformer< Out(const vector_of_const_< In > void
Implementation of the detection idiom (negative case).
Definition: detected.h:24
static constexpr bool value
Definition: detected.h:25
Helper functions to set/get the application return code.
Definition: __init__.py:1
typename details::detector< Default, void, Op, Args... >::type detected_or_t
Definition: detected.h:47