The Gaudi Framework  v32r2 (46d42edc)
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::cpp17 {
10  namespace details {
11 
13  template <typename Default, typename AlwaysVoid, template <typename...> class Op, typename... Args>
14  struct detector {
15  constexpr static bool value = false;
16  using type = Default;
18  };
19 
21  template <typename Default, template <typename...> class Op, typename... Args>
22  struct detector<Default, std::void_t<Op<Args...>>, Op, Args...> {
23  constexpr static bool value = true;
24  using type = Op<Args...>;
26  };
27  } // namespace details
28 
29  template <template <class...> class Op, class... Args>
30  using is_detected = details::detector<void, void, Op, Args...>;
31 
32  template <template <class...> class Op, class... Args>
33  inline constexpr bool is_detected_v = is_detected<Op, Args...>::value;
34 
35  template <template <class...> class Op, class... Args>
36  using detected_t = typename is_detected<Op, Args...>::type;
37 
38  // Op<Args...> if that is a valid type, otherwise Default.
39  template <typename Default, template <typename...> class Op, typename... Args>
40  using detected_or_t = typename details::detector<Default, void, Op, Args...>::type;
41 
42 } // namespace Gaudi::cpp17
43 
44 #endif
constexpr bool is_detected_v
Definition: detected.h:33
typename is_detected< Op, Args... >::type detected_t
Definition: detected.h:36
STL namespace.
Implementation of the detection idiom (negative case).
Definition: detected.h:14
static constexpr bool value
Definition: detected.h:15
typename details::detector< Default, void, Op, Args... >::type detected_or_t
Definition: detected.h:40