[英]How to define a template function with the help of std::enable_if
我要做的是定义一个模板 function,它只能由继承一些类的 class 专门化。
例如,我已经有两个 class Base1
和Base2
。 我正在尝试定义这样一个模板 function:
template<typename T> // if (std::is_base_of<Base1, T>::value || std::is_base_of<Base2, T>::value)
std::ostream & operator<<(std::ostream &os, const T& t)
{
// os << t.member1 << t.member2...;
return os;
}
似乎std::enable_if
可以提供帮助,但我不知道如何。
template <typename T, typename = typename std::enable_if<
std::is_base_of<Base1, T>::value ||
std::is_base_of<Base2, T>::value>::type>
std::ostream &operator<<(std::ostream &os, const T &t) {
// os << t.member1 << t.member2...;
return os;
}
或者:
template <typename T, typename std::enable_if<
std::is_base_of<Base1, T>::value ||
std::is_base_of<Base2, T>::value>::type * = nullptr>
std::ostream &operator<<(std::ostream &os, const T &t) {
// os << t.member1 << t.member2...;
return os;
}
当想要提供仅在 SFINAE 谓词上有所不同的互斥 SFINAE 约束重载时,后一种方法可能很有用。 The former approach is not viable in that case as two template functions differing only in their default template arguments declare the same function template, as default template arguments are not part of a function template's signature.
std::enable_if_t
实用程序别名模板)template <typename T,
typename = std::enable_if_t<std::is_base_of<Base1, T>::value ||
std::is_base_of<Base2, T>::value>>
std::ostream &operator<<(std::ostream &os, const T &t) {
// os << t.member1 << t.member2...;
return os;
}
_v
实用程序变量模板)template <typename T, typename = std::enable_if_t<std::is_base_of_v<Base1, T> ||
std::is_base_of_v<Base2, T>>>
std::ostream &operator<<(std::ostream &os, const T &t) {
// os << t.member1 << t.member2...;
return os;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.