00001
00002
00003 #ifndef DUNE_COMMON_STD_TYPE_TRAITS_HH
00004 #define DUNE_COMMON_STD_TYPE_TRAITS_HH
00005
00006 #include <type_traits>
00007 #include <dune/common/typetraits.hh>
00008 #include <dune/common/typeutilities.hh>
00009
00010 namespace Dune
00011 {
00012
00013 namespace Std
00014 {
00015
00016
00017
00018
00062 template< typename T >
00063 struct to_false_type : public std::false_type {};
00064
00065
00066
00067
00068
00069
00078 template< typename T >
00079 struct to_true_type : public std::true_type {};
00080
00081
00082 #if __cpp_lib_bool_constant
00083
00084 using std::bool_constant;
00085
00086 #elif __cpp_lib_experimental_bool_constant
00087
00088 using std::experimental::bool_constant;
00089
00090 #else
00091
00097 template <bool value>
00098 using bool_constant = std::integral_constant<bool, value>;
00099
00100 #endif
00101
00102
00103 namespace Imp {
00104
00105
00106
00107
00108 template<class R, class F, class... Args,
00109 std::enable_if_t<
00110 std::is_same<void_t<std::result_of_t<F(Args...)>>, R>::value
00111 , int> = 0>
00112 std::true_type is_callable_helper(PriorityTag<2>)
00113 { return {}; }
00114
00115
00116
00117
00118 template<class R, class F, class... Args,
00119 std::enable_if_t<
00120 std::is_convertible<std::result_of_t<F(Args...)>, R>::value
00121 , int> = 0>
00122 std::true_type is_callable_helper(PriorityTag<1>)
00123 { return {}; }
00124
00125
00126
00127
00128 template<class R, class F, class... Args>
00129 std::false_type is_callable_helper(PriorityTag<0>)
00130 { return {}; }
00131 }
00132
00148 template <class D, class R= void>
00149 struct is_callable;
00150
00166 template <class F, class... Args, class R>
00167 struct is_callable< F(Args...), R> :
00168 decltype(Imp::is_callable_helper<R, F, Args...>(PriorityTag<42>()))
00169 {};
00170
00171
00172
00173
00174
00175
00176
00177
00178 }
00179
00180 }
00181
00182 #endif // #ifndef DUNE_COMMON_STD_TYPE_TRAITS_HH