【发布时间】:2021-08-15 06:19:08
【问题描述】:
让我们看一下enable_if用法的简单例子
template <bool, typename T = void>
struct enable_if
{
};
template <typename T>
struct enable_if<true, T>
{
typedef T type;
};
- 这里预计
y将是int,因为T是我们的“启用”类型。
template <typename T, typename Y = typename std::enable_if<std::is_integral<T>::value, T>::type>
void do_stuff(T t)
{
(void)t;
Y y;
std::cout << typeid(y).name() << std::endl;
}
do_stuff(15); // int
- 但这里的事情对我来说有些不明确,
y将被推断为实际参数的类型
template <typename T, typename Y = typename std::enable_if<std::is_integral<T>::value, T>::type>
void do_stuff(T t, Y y)
{
(void)t;
std::cout << "do_stuff integral\n";
std::cout << typeid(y).name() << std::endl;
}
do_stuff(15, 14.3); // double
所以我的问题是:
强制编译器优先从传递的实际参数中扣除y 并忽略enable_if 中启用的type 的规则是什么?
【问题讨论】:
-
就是这样。如果可以,编译器将始终推断出参数。如果只有当它不能时,它使用默认值。
标签: c++ templates sfinae enable-if