检测习语与默认参数类型匹配
detection idiom and default parameter type match
我可以编写以下代码来检测对象是否可序列化。
template <typename T, typename = int>
struct is_serializable : std::false_type {};
template<typename T>
struct is_serializable <T, decltype(std::declval<std::ostream>() << std::declval<T>(), 0)> : std::true_type { };
template <typename T>
constexpr bool is_serializable_v = is_serializable<T>::value;
我知道这是表达式 SFINAE 并且仅当表达式的类型可推导时才选择重载。否则选择默认实现。但为什么 decltype
表达式的结果类型必须与默认参数的类型相匹配。如果我编写以下代码,它将不再起作用:
template <typename T, typename = int>
struct is_serializable : std::false_type {};
template<typename T>
struct is_serializable <T, decltype(std::declval<std::ostream>() << std::declval<T>(), 0L)> : std::true_type { };
template <typename T>
constexpr bool is_serializable_v = is_serializable<T>::value;
第二种情况,你"specialize"
struct is_serializable <T, long> // For T serializable
但您在 is_serializable_v
中请求的类型 is_serializable <T, int>
永远不会与您的专业匹配。
部分默认参数说明:
template <typename T, typename = int>
struct is_serializable : std::false_type {};
// Specializations...
可以看作
template <typename T, typename = int>
struct is_serializable;
// So writing is_serializable<T> would be is_serializable<T, int>
template <typename T, typename>
struct is_serializable : std::false_type {};
// fallback for any combination not in specialization
// as <NonSerializable, int> <NonSerializable, std::string>
// <Serializable, string>
// but not <Serializable, int> which is part of specializations
// Specializations...
我可以编写以下代码来检测对象是否可序列化。
template <typename T, typename = int>
struct is_serializable : std::false_type {};
template<typename T>
struct is_serializable <T, decltype(std::declval<std::ostream>() << std::declval<T>(), 0)> : std::true_type { };
template <typename T>
constexpr bool is_serializable_v = is_serializable<T>::value;
我知道这是表达式 SFINAE 并且仅当表达式的类型可推导时才选择重载。否则选择默认实现。但为什么 decltype
表达式的结果类型必须与默认参数的类型相匹配。如果我编写以下代码,它将不再起作用:
template <typename T, typename = int>
struct is_serializable : std::false_type {};
template<typename T>
struct is_serializable <T, decltype(std::declval<std::ostream>() << std::declval<T>(), 0L)> : std::true_type { };
template <typename T>
constexpr bool is_serializable_v = is_serializable<T>::value;
第二种情况,你"specialize"
struct is_serializable <T, long> // For T serializable
但您在 is_serializable_v
中请求的类型 is_serializable <T, int>
永远不会与您的专业匹配。
部分默认参数说明:
template <typename T, typename = int>
struct is_serializable : std::false_type {};
// Specializations...
可以看作
template <typename T, typename = int>
struct is_serializable;
// So writing is_serializable<T> would be is_serializable<T, int>
template <typename T, typename>
struct is_serializable : std::false_type {};
// fallback for any combination not in specialization
// as <NonSerializable, int> <NonSerializable, std::string>
// <Serializable, string>
// but not <Serializable, int> which is part of specializations
// Specializations...