我很难理解 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>
时不会导致替换错误做。
有没有人看出我论证中的错误?
最佳答案
如评论中所述,您必须添加 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;
}
关于c++ - 了解 SFINAE 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40040070/