了解 SFINAE 示例
Understanding an SFINAE example
我很难理解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>
会。
有没有人看出我论证的错误?
如评论中所述,您必须在 std::enable_if
之前添加 typename
因为 ::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
的别名,"embeds" 附加的 typename
:
template< size_t M, std::enable_if_t<M==1,size_t> = 0>
int foo()
{
return 1;
}
我很难理解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>
会。
有没有人看出我论证的错误?
如评论中所述,您必须在 std::enable_if
之前添加 typename
因为 ::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
的别名,"embeds" 附加的 typename
:
template< size_t M, std::enable_if_t<M==1,size_t> = 0>
int foo()
{
return 1;
}