这里的原标题是 Workaround for SFINAE bug in VS2005 C++
这是对 SFINAE 的尝试性使用,以等效于 TR1 中存在的 is_pod 模板类(在 VS2005 中还没有 TR1)。当模板参数是 POD 类型(包括原始类型和由它们构成的结构)时,它的值成员应该为true,而在不是时(如非平凡的构造函数),它的值成员应该为 false。
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 都评估为 true。
感谢您在下面发布的答案。在仔细阅读它们(和代码)之后,我意识到我试图做的确实是一个错误的方法。这个想法是将 SFINAE 行为与对模板must_be_pod的适应结合起来(我在Imperfect C++一书中找到了它,但它也可以在其他地方找到)。实际上,这需要一套非常特殊的 SFINAE 规则,这显然不是标准定义的。毕竟,这并不是 VS 中的真正错误。