【发布时间】:2021-01-03 23:36:20
【问题描述】:
这里的原标题是 VS2005 C++ 中 SFINAE 错误的解决方法
这是对 SFINAE 的尝试性使用,以等效于 TR1 中存在的 is_pod 模板类(在 VS2005 中还没有 TR1)。当模板参数是 POD 类型(包括原始类型和由它们构成的结构)时,它的 value 成员应该有它的成员,而当它不是时(比如非平凡的构造函数),它应该有它的 value 成员。
template <typename T> class is_pod
{
public:
typedef char Yes;
typedef struct {char a[2];} No;
template <typename C> static Yes test(int)
{
union {T validPodType;} u;
}
template <typename C> static No test(...)
{
}
enum {value = (sizeof(test<T>(0)) == sizeof(Yes))};
};
class NonPOD
{
public:
NonPod(const NonPod &);
virtual ~NonPOD();
};
int main()
{
bool a = is_pod<char>::value;
bool b = is_pod<NonPOD>::value;
if (a)
printf("char is POD\n");
if (b)
printf("NonPOD is POD ?!?!?\n");
return 0;
}
问题是,不仅 VS 2005 没有 TR1,它也不关心上面的联合(当模板参数不是 POD 时它不应该是有效的),所以 a 和 b 都计算为真的。
感谢下面发布的答案。在仔细阅读它们(和代码)之后,我意识到我试图做的确实是一个错误的方法。想法是将 SFINAE 行为与对模板 must_be_pod 的适应结合起来(我在 Imperfect C++ 一书中找到了它,但它也可以在其他地方找到)。实际上,这需要一套非常特殊的 SFINAE 规则,这显然不是标准定义的。毕竟,这并不是 VS 中的真正错误。
【问题讨论】:
标签: c++ visual-studio-2005 sfinae