【问题标题】:C++ std::enable_if - Second Argument's FunctionalityC++ std::enable_if - 第二个参数的功能
【发布时间】:2018-09-06 20:44:54
【问题描述】:

我已经开始使用经常使用模板功能的代码,但我发现这部分语言非常陌生,尽管我非常熟悉 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 的答案,但无法从他们那里获得足够的理解来回答我的问题。

【问题讨论】:

  • 请参阅 cppreference.com 上的 documentation。此外,您链接到的问题的公认答案非常清楚enabled_if 在这种情况下如何工作。如果第一个参数是false,则忽略第二个参数,type 未定义,因此调用模板格式错误,在重载解析期间被忽略。那么你到底在理解什么方面有困难?

标签: c++ templates


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多