簡體   English   中英

C ++ std :: enable_if-第二個參數的功能

[英]C++ std::enable_if - Second Argument's Functionality

我已經開始使用經常使用模板功能的代碼,但是即使我非常熟悉C ++的許多其他功能,我也發現這部分語言很陌生。

我正在編寫一些測試代碼,如下所示:

#include <iostream>

template <class T,
          typename std::enable_if<std::is_integral<T>::value, T>::type* = nullptr>
void foo(T arg) {
  std::cout << "Integral template" << std::endl;
}

template <class T,
          typename std::enable_if<std::is_class<T>::value, T>::type* = nullptr>
void foo(T arg) {
  std::cout << "Class template" << std::endl;
}

class MyClass{
 public:
  MyClass() {}
};

int main() {
  foo(3);
  foo(MyClass());

  return 0;
}

這給出了輸出

Integral template
Class template

在這一點上讓我擔心的是std::enable_if的第二個參數中的T類型,因為我看不到它有任何作用。 如果我只是將其替換為類似int簡單內容怎么辦?

#include <iostream>

template <class T,
          typename std::enable_if<std::is_integral<T>::value, int>::type = 0>
void foo(T arg) {
  std::cout << "Integral template" << std::endl;
}

template <class T,
          typename std::enable_if<std::is_class<T>::value, int>::type = 0>
void foo(T arg) {
  std::cout << "Class template" << std::endl;
}

class MyClass{
 public:
  MyClass() {}
};

int main() {
  foo(3);
  foo(MyClass());

  return 0;
}

我確定總體上很重要,但是在這種情況下,輸出是相同的。 在表面之下,有什么區別? 編譯器如何准確地讀取和解釋這種類型的聲明?

我已經查看了有關此問題的答案,但是我無法從他們那里獲得足夠的理解來回答我的問題。

在您的情況下,您可以放置​​可以為其提供默認值的任何類型,因此int完全有效。 指針也是一種常見的替代選擇(因此,您的情況是T* )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM