SFINAE 在非类型模板中不起作用 class
SFINAE does not work in a non-type template class
我想使用 SFINAE select 特定函数编译到模板中 class 非类型
争论,我是这样做的:
#include<iostream>
#include<type_traits>
template <bool T>
struct is_right
{
template <class Q = std::bool_constant<T>>
typename std::enable_if<std::is_same<Q, std::bool_constant<true>>::value, bool>::type check()
{
return true;
}
template <class Q = std::bool_constant<!T>>
typename std::enable_if<std::is_same<Q, std::bool_constant<false>>::value, bool>::type check()
{
return false;
}
};
int main() {
is_right<false> is_fs;
is_right<true> is_ri;
if(!is_fs.check() && is_ri.check()){
std::cout << "It is right!" << std::endl;
}
return 0;
}
我使用 c++17 标准用 g++ 8.1.0 编译它。
但是编译器给我一个错误,说“没有匹配函数来调用 'is_right::check()'”。
但是,如果我只是用类型参数替换非类型模板参数,它会起作用:
#include<iostream>
#include<type_traits>
template <class T>
struct is_right
{
template <class Q = T>
typename std::enable_if<std::is_same<Q, std::bool_constant<true>>::value, bool>::type check()
{
return true;
}
template <class Q = T>
typename std::enable_if<std::is_same<Q, std::bool_constant<false>>::value, bool>::type check()
{
return false;
}
};
int main() {
is_right<std::bool_constant<false>> is_fs;
is_right<std::bool_constant<true>> is_ri;
if(!is_fs.check() && is_ri.check()){
std::cout << "It is right!" << std::endl;
}
return 0;
}
它们有本质区别吗?
第二个check
函数的默认模板参数错误,应该是std::bool_constant<T>
而不是std::bool_constant<!T>
。
调用 is_fs.check()
没有匹配函数,因为您在第一次重载中测试 is_same<bool_constant<false>, bool_constant<true>>
,在第二次重载中测试 is_same<bool_constant<true>, bool_constant<false>>
。
另请注意,现在调用 is_ri.check()
是不明确的,因为两个 check
函数在 is_right<true>
.
中均有效
我想使用 SFINAE select 特定函数编译到模板中 class 非类型 争论,我是这样做的:
#include<iostream>
#include<type_traits>
template <bool T>
struct is_right
{
template <class Q = std::bool_constant<T>>
typename std::enable_if<std::is_same<Q, std::bool_constant<true>>::value, bool>::type check()
{
return true;
}
template <class Q = std::bool_constant<!T>>
typename std::enable_if<std::is_same<Q, std::bool_constant<false>>::value, bool>::type check()
{
return false;
}
};
int main() {
is_right<false> is_fs;
is_right<true> is_ri;
if(!is_fs.check() && is_ri.check()){
std::cout << "It is right!" << std::endl;
}
return 0;
}
我使用 c++17 标准用 g++ 8.1.0 编译它。 但是编译器给我一个错误,说“没有匹配函数来调用 'is_right::check()'”。
但是,如果我只是用类型参数替换非类型模板参数,它会起作用:
#include<iostream>
#include<type_traits>
template <class T>
struct is_right
{
template <class Q = T>
typename std::enable_if<std::is_same<Q, std::bool_constant<true>>::value, bool>::type check()
{
return true;
}
template <class Q = T>
typename std::enable_if<std::is_same<Q, std::bool_constant<false>>::value, bool>::type check()
{
return false;
}
};
int main() {
is_right<std::bool_constant<false>> is_fs;
is_right<std::bool_constant<true>> is_ri;
if(!is_fs.check() && is_ri.check()){
std::cout << "It is right!" << std::endl;
}
return 0;
}
它们有本质区别吗?
第二个check
函数的默认模板参数错误,应该是std::bool_constant<T>
而不是std::bool_constant<!T>
。
调用 is_fs.check()
没有匹配函数,因为您在第一次重载中测试 is_same<bool_constant<false>, bool_constant<true>>
,在第二次重载中测试 is_same<bool_constant<true>, bool_constant<false>>
。
另请注意,现在调用 is_ri.check()
是不明确的,因为两个 check
函数在 is_right<true>
.