我很难理解SFINAE。例如,我不明白为什么以下代码无法编译:
#include <iostream>
using namespace std;
// first implementation
template< size_t M, std::enable_if<M==1,size_t>::type = 0>
int foo()
{
return 1;
}
// second implementation
template< size_t M, std::enable_if<M!=1,size_t>::type = 0>
float foo()
{
return 1.0f;
}
int main() {
std::cout << foo<1>() << std::endl;
return 0;
}
我预计会出现以下行为:foo<1>
使用第一个实现,因为std::enable_if < M==1,size_t>::type = 0>
导致std::enable_if < M!=1,size_t>::type = 0>
没有替换错误。
有没有人在我的论证中看到错误?
答案 0 :(得分:1)
正如评论中所述,您必须在typename
之前添加std::enable_if
,因为::type
是dependent type:
template< size_t M, typename std::enable_if<M==1,size_t>::type = 0>
int foo()
{
return 1;
}
在C ++ 14中,您可以使用std::enable_if_t
,这是std::enable_if<...>::type
的别名,并“嵌入”其他typename
:
template< size_t M, std::enable_if_t<M==1,size_t> = 0>
int foo()
{
return 1;
}