这里原来的标题是VS2005 C++ 中 SFINAE 错误的解决方法
这是暂时使用 SFINAE 来等效 TR1 中存在的 is_pod 模板类(在 VS2005 中还没有 TR1)。应该有它的value当模板参数是 POD 类型(包括基本类型和由它们组成的结构)时,成员为 true;当模板参数不是 POD 类型时(如非平凡的构造函数),成员为 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 行为与对模板的适应结合起来必须是 pod(我在书上找到的不完美的C++,但也可以在其他地方找到)。实际上,这需要 SFINAE 制定一套非常特殊的规则,显然这不是标准定义的。毕竟,这并不是 VS 中的一个真正的错误。
您的方法的最大问题是您在这里不执行 SFINAE - SFINAE 仅适用于此处的参数类型和返回类型。
然而,在标准中的所有 SFINAE 情况中,没有一个适用于您的情况。他们是
- void、引用、函数或大小无效的数组
- 不是类型的类型成员
- 指向引用的指针、对引用的引用、对 void 的引用
- 指向非类类型成员的指针
- 模板值参数的转换无效
- 参数类型为 void 的函数类型
- 常量/易失性函数类型
这可能就是为什么 Boost 文档中有:
没有一些(尚未指定)帮助
从编译器来看,ispod 永远不会
报告一个类或结构是
荚;如果可能的话,这总是安全的
次优。目前(2005 年 5 月)仅
MWCW 9 和 Visual C++ 8 具有
必要的编译器-_intrinsics。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)