簡體   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