metaprogramming.h
Go to the documentation of this file.
1 #ifndef cetlib_metaprogramming_h
2 #define cetlib_metaprogramming_h
3 
4 // Common metaprogramming utilities.
5 
6 #include <type_traits>
7 
8 namespace cet {
9 
10  using no_tag = char (&)[1]; // type indicating FALSE
11  using yes_tag = char (&)[2]; // type indicating TRUE
12 
13  //=====================================
14  // Detect type
15  //
16  // Use idiom:
17  //
18  // template <typename T, typename = void>
19  // struct has_nested_type : std::false_type {};
20  //
21  // template <typename T>
22  // struct has_nested_type<T, enable_if_type_exists_t<typename
23  // T::NestedType>> : std::true_type {}
24  //
25  template <class T>
26  using enable_if_type_exists_t [[deprecated(
27  "\n\ncetlib warning: Please use std::void_t<T> instead.\n\n")]] =
28  std::void_t<T>;
29 
30  //=====================================
31  // Detect function
32  //
33  // Use idiom:
34  //
35  // template <typename T, typename = void>
36  // struct has_my_function : std::false_type {};
37  //
38  // template <typename T>
39  // struct has_my_function<T, enable_if_function_exists_t<void(T::*)(int),
40  // &T::my_function>> : std::true_type {}
41  //
42  template <typename T, typename U, typename R = void>
43  using enable_if_same_t = std::enable_if_t<std::is_same_v<T, U>, R>;
44 
45  template <typename FT, FT f, typename R = void>
47 }
48 #endif /* cetlib_metaprogramming_h */
49 
50 // Local Variables:
51 // mode: c++
52 // End:
char(&)[2] yes_tag
std::enable_if_t< std::is_same_v< T, U >, R > enable_if_same_t
enable_if_same_t< FT, decltype(f), R > enable_if_function_exists_t
#define R(x)
char(&)[1] no_tag