C ++ std :: enable_if-第二个参数的功能

时间:2018-09-06 20:44:54

标签: c++ templates

我已经开始使用经常使用模板功能的代码,但是即使我非常熟悉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

这时让我担心的是T的第二个参数中的类型std::enable_if,因为我看不到它有任何作用。如果我只是将其替换为简单的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;
}

我确定这通常很重要,但是在这种情况下,输出是相同的。在表面之下,有什么区别?编译器如何准确地读取和解释这种类型的声明?

我已经查看了this question的答案,但无法从他们那里得到足够的理解来回答我的问题。

1 个答案:

答案 0 :(得分:0)

在您的情况下,您可以放置​​可以为其提供默认值的任何类型,因此int是完全有效的。指针也是一种常见的替代方法(在您的情况下为T*