我目前正在尝试理解一段C++代码,并遇到了SFINAE结构(对我来说是新的)。 我已经基于我正在查看的代码创建了一个最小示例,如下所示:
#include<iostream>
/* ----------------------------------------------
Define two kernels: characterized by their dimension
---------------------------------------------- */
struct Kern2
{
static constexpr int dim = 2;
};
struct Kern3
{
static constexpr int dim = 3;
};
/* ----------------------------------------------
Choose which function to evaluate based on
dimension of Kern (Kern::dim)
---------------------------------------------- */
template<class Kern,
typename std::enable_if<Kern::dim == 2, bool>::type = true>
inline void apply_kern(){
std::cout << "dim=2" << "\n";
}
template<class Kern,
typename std::enable_if<Kern::dim == 3, bool>::type = false>
inline void apply_kern(){
std::cout << "dim=3" << "\n";
}
// Try to see if the above SFINAE construct works!
int main()
{
apply_kern<Kern2>(); // should print 'dim=2'
apply_kern<Kern3>(); // should print 'dim=3'
return 0;
}
这将输出:
> dim=2
> dim=3
这正是它应该做的事情。然而,我无法准确理解 它是如何工作的?特别是,如果我切换
标签,似乎会创建相同的输出。typename std::enable_if<Kern::dim == 2, bool>::type = true
到以下行:
typename std::enable_if<Kern::dim == 2, bool>::type = false
所以我想知道这些的意思是什么?如果有人能够友好地解释一下正在发生什么,我将不胜感激!不幸的是,我在网上找不到这种使用SFINAE的确切方式。
谢谢!
=true
或=false
并不是比较运算符,它们只是模板参数的默认值,如果省略了模板参数则会使用这些默认值。SFINAE魔法是在std::enable_if
内部完成的,而不是在=true/false
中完成的。 - Werner Henze