The Gaudi Framework  v31r0 (aeb156f0)
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  namespace cpp17 {
11  namespace details {
12  template <typename...>
13  struct void_t_ {
14  using type = void;
15  };
16  template <typename... T>
17  using void_t = typename void_t_<T...>::type;
18 
20  template <typename Default, typename AlwaysVoid, template <typename...> class Op, typename... Args>
21  struct detector {
22  constexpr static bool value = false;
23  using type = Default;
25  };
26 
28  template <typename Default, template <typename...> class Op, typename... Args>
29  struct detector<Default, void_t<Op<Args...>>, Op, Args...> {
30  constexpr static bool value = true;
31  using type = Op<Args...>;
33  };
34  } // namespace details
35 
36  template <template <class...> class Op, class... Args>
37  using is_detected = details::detector<void, void, Op, Args...>;
38 
39  template <template <class...> class Op, class... Args>
40  using detected_t = typename is_detected<Op, Args...>::type;
41 
42  // Op<Args...> if that is a valid type, otherwise Default.
43  template <typename Default, template <typename...> class Op, typename... Args>
44  using detected_or_t = typename details::detector<Default, void, Op, Args...>::type;
45  } // namespace cpp17
46 } // namespace Gaudi
47 
48 #endif
typename is_detected< Op, Args... >::type detected_t
Definition: detected.h:40
typename void_t_< T... >::type void_t
Definition: detected.h:17
class MergingTransformer< Out(const vector_of_const_< In > void
Implementation of the detection idiom (negative case).
Definition: detected.h:21
static constexpr bool value
Definition: detected.h:22
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:44