C++14(使用
C++17(使用
我要做的是定义一个模板函数,它只能由继承了一些类的类进行特殊化。
例如,我已经有了两个类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;
}