SFINAE 无法使用模板的成员函数 class
SFINAE not working with member function of template class
我有一个模板 class 如果类型满足某些条件,我想在其中删除一个成员函数,据我所知,这应该是 SFINAE 的一个非常基本的用法,例如:
template<class T>
class A
{
public:
template<typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
T foo () {
return 1.23;
}
};
然而,这会导致错误“没有名为 'type' 的类型”,就像 SFINAE 没有进行一样。但是,如果 foo
不是 class 的函数,则此方法有效。这个实现有什么问题?
您缺少供编译器用于 SFINAE 的相关名称。尝试这样的事情:
#include <type_traits>
template<class T>
class A
{
public:
template<typename Tp = T>
typename std::enable_if<std::is_floating_point<Tp>::value, Tp>::type
foo () {
return 1.23;
}
};
int main() {
A<double> a;
a.foo();
}
如果类型 T 不是浮点数,声明将是错误的(没有 return 类型)并且函数不会被考虑用于重载集。
在 godbolt 上查看。
我有一个模板 class 如果类型满足某些条件,我想在其中删除一个成员函数,据我所知,这应该是 SFINAE 的一个非常基本的用法,例如:
template<class T>
class A
{
public:
template<typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
T foo () {
return 1.23;
}
};
然而,这会导致错误“没有名为 'type' 的类型”,就像 SFINAE 没有进行一样。但是,如果 foo
不是 class 的函数,则此方法有效。这个实现有什么问题?
您缺少供编译器用于 SFINAE 的相关名称。尝试这样的事情:
#include <type_traits>
template<class T>
class A
{
public:
template<typename Tp = T>
typename std::enable_if<std::is_floating_point<Tp>::value, Tp>::type
foo () {
return 1.23;
}
};
int main() {
A<double> a;
a.foo();
}
如果类型 T 不是浮点数,声明将是错误的(没有 return 类型)并且函数不会被考虑用于重载集。
在 godbolt 上查看。