繁体   English   中英

如何在 std::enable_if 的帮助下定义模板 function

[英]How to define a template function with the help of std::enable_if

我要做的是定义一个模板 function,它只能由继承一些类的 class 专门化。

例如,我已经有两个 class Base1Base2 我正在尝试定义这样一个模板 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可以提供帮助,但我不知道如何。

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 约束重载时,后一种方法可能很有用。 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.

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM