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, class R = void>
27  using type = R;
28  };
29 
30  template <class T>
32 
33  //=====================================
34  // Detect function
35  //
36  // Use idiom:
37  //
38  // template <typename T, typename = void>
39  // struct has_my_function : std::false_type {};
40  //
41  // template <typename T>
42  // struct has_my_function<T, enable_if_function_exists_t<void(T::*)(int),
43  // &T::my_function>> : std::true_type {}
44  //
45  template <typename T, typename U, typename R = void>
47 
48  template <typename FT, FT f, typename R = void>
50 }
51 #endif /* cetlib_metaprogramming_h */
52 
53 // Local Variables:
54 // mode: c++
55 // End:
char(&)[2] yes_tag
enable_if_same_t< FT, decltype(f), R > enable_if_function_exists_t
const XML_Char int const XML_Char * value
Definition: expat.h:331
#define R(x)
char(&)[1] no_tag
std::enable_if_t< std::is_same< T, U >::value, R > enable_if_same_t
typename enable_if_type_exists< T >::type enable_if_type_exists_t