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

标签 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

此时我关心的是 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;
}

我确信它在一般情况下很重要,但在这种情况下输出是相同的。在表面之下,有什么不同?编译器究竟是如何读取和解释这种类型的声明的?

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

最佳答案

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

关于C++ std::enable_if - 第二个参数的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52211922/

相关文章:

c# - 通过CMD以兼容模式运行可执行文件

c++ - 为什么我们需要引用折叠规则

c++ - 在 C++ 中的模板中声明另一个模板变量

c++ - 对类方法进行指针部分特化时获取 "illegal use of explicit template arguments"

C++/C 使用 berkeleys/bsd 套接字从 http 下载文件

c++ - 共享库仅绑定(bind)到不处理的库

c++ - 删除或复制文件夹树时如何处理符号链接(symbolic link)和连接

c++ - 类和函数模板实例化的 Visual Studio dll 导出问题

C++:声明 multimap 迭代器时出错

c++ - 是否可以用 C++ 编写不纯的模板?