出于好奇,我正在尝试 is_class 的替代实现使用 sizeof()
构建诡计。以下是代码:
template<typename T>
struct is_class
{
typedef char (&yes)[7];
typedef char (&no)[3];
static yes check (int T::*);
static no check (...);
enum { value = (sizeof(check(0)) == sizeof(yes)) };
};
问题是当我实例化 is_class<int>
时,它给出了编译错误:
error: creating pointer to member of non-class type ‘int’
现在,我的问题是,如果 int T::*
不适用于 int
(或 void*
等)那么为什么 不替换失败 yes check
.编译器不应该选择 no check
?
最佳答案
yes
和 no
不是模板,SFINAE 不可能应用于它们。你需要这样做:
template<typename T>
struct is_class
{
typedef char (&yes)[7];
typedef char (&no)[3];
template <typename U>
static yes check (int U::*);
template <typename>
static no check (...);
enum { value = (sizeof(check<T>(0)) == sizeof(yes)) };
};
现在 SFINAE 可以开始了。
关于c++ - 为什么 SFINAE 技巧在尝试类成员指针时不适用于非类类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6563734/