You can make a type trait according to your needs:
template<typename Type, typename Enable=void>
struct has_t : std::false_type {};
template<typename Type>
struct has_t<Type, void_t<Type::T>> : std::true_type {};
void_t implemented as follows:
template<typename...>
struct voider {
using type = void;
};
template<class... Ts> using void_t = typename voider<Ts...>::type;
This implementation is void_tguaranteed to work in C ++ 11.
:
template<typename C, typename std::enable_if<has_t<typename std::decay<C>::type>::value, int>::type = 0>
void f(C&& c) {
}
template<typename C, typename std::enable_if<!has_t<typename std::decay<C>::type>::value, int>::type = 0>
void f(C&& c) {
}
, . typedef C , C&, .