在以下代码示例中:
template<typename T>
struct Foo
{
template<typename U = T>
typename std::enable_if<std::is_same<U, int>::value>::type
MyFunction()
{
std::cout << "T is int." << std::endl;
}
template<typename U = T>
typename std::enable_if<std::is_same<U, float>::value>::type
MyFunction()
{
std::cout << "T is not int." << std::endl;
}
};
template<typename U = T>
部分的意义是什么?
当我们创建类型为Foo
的{{1}}实例时,int
将为T
。现在我们有另一个类型int
,它等于U
。因此,它也是T
。 (这同样适用于任何其他提供的类型。)由于int
,它看起来像是代码的冗余部分。但是,如果我删除了T=U=int
,则代码将无法编译(在这种情况下,template<typename U = T>
在U
中被T
替换了)。
有人可以详细解释一下编译时在这里发生的事情吗?
我对“那是SFINAE,这就是SFINAE的工作方式”之类的答案不感兴趣。这样的答案是没有用的。