c++ - 如何在 std::enable_if 的帮助下定义模板函数
问题描述
我要做的是定义一个模板函数,它只能由继承一些类的类来专门化。
例如,我已经有两个班级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 ||
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 约束重载时,后一种方法可能很有用。在这种情况下,前一种方法是不可行的,因为两个仅在默认模板参数上有所不同的模板函数声明了相同的函数模板,因为默认模板参数不是函数模板签名的一部分。
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;
}
推荐阅读
- java - YGuard 混淆后无法从内部类访问私有字段和方法
- collections - 如果可以转换元素,为什么不能使用 .into() 转换容器?
- javascript - 如何使用 App 脚本将 HTML 表单提交到 Google 表单?
- .htaccess - 如何将此异常添加到htaccess?
- python - 了解 TfidfVectorizer 输出
- c# - 如何从亚马逊销售合作伙伴 api 解密亚马逊报告文件
- uipath - UiPath Get Text 让机器人崩溃
- android - 如何通过聊天屏幕通知打开活动?
- python - 如何仅通过 Python Pandas 数据框中的现有对创建循环?
- ruby - 通过md5摘要字符串计算base64digest