如何解决如何在 std::enable_if 的帮助下定义模板函数 C++11C++14使用 std::enable_if_t 实用程序别名模板C++17使用 _v 实用程序变量模板
我想要做的是定义一个模板函数,它只能由继承一些类的类专门化。
例如,我已经有两个类 Base1
和 Base2
。我正在尝试定义这样一个模板函数:
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
可以提供帮助,但我不知道如何。
解决方法
C++11
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>::type * = nullptr>
std::ostream &operator<<(std::ostream &os,const T &t) {
// os << t.member1 << t.member2...;
return os;
}
后一种方法在想要提供互斥的 SFINAE 约束重载时很有用,这些重载仅在 SFINAE 谓词上有所不同。在这种情况下,前一种方法是不可行的,因为两个模板函数的区别仅在于它们的默认模板参数声明相同的函数模板,因为默认模板参数不是函数模板签名的一部分。
C++14(使用 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;
}
C++17(使用 _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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。