【发布时间】: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未定义,因此调用模板格式错误,在重载解析期间被忽略。那么你到底在理解什么方面有困难?