gpt4 book ai didi

c++ - 使用 SFINAE 检测 C++ 中类型的 POD-ness

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:11 26 4
gpt4 key购买 nike

这里的原标题是解决 VS2005 C++ 中 SFINAE 错误的方法

这是尝试性地使用 SFINAE 来为 TR1 中存在的 is_pod 模板类创建等效项(在 VS2005 中还没有 TR1)。当模板参数是 POD 类型(包括基本类型和由它们构成的结构)时,它的 value 成员应该是 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 的计算结果都是是的。


感谢您在下面发布的答案。仔细阅读它们(和代码)后,我意识到我试图做的事情确实是一种错误的方法。这个想法是将 SFINAE 行为与对模板 must_be_pod 的改编相结合(我在 Imperfect C++ 一书中找到了它,但它也可以在其他地方找到)。实际上,这需要一套非常特殊的 SFINAE 规则,这显然不是标准定义的。毕竟,这并不是 VS 中的真正错误。

最佳答案

您的方法最大的问题是您不在此处执行 SFINAE - SFINAE 仅适用于此处的参数类型和返回类型。

但是,在标准中的所有 SFINAE 情况中,没有一个适用于您的情况。他们是

  • void、引用、函数或无效大小的数组
  • 类型成员不是类型
  • 指向引用的指针、指向引用的引用、指向 void 的引用
  • 指向非类类型成员的指针
  • 模板值参数的无效转换
  • 参数类型为 void 的函数类型
  • const/volatile 函数类型

这可能就是为什么在 Boost 文档中,有:

Without some (as yet unspecified) help from the compiler, ispod will never report that a class or struct is a POD; this is always safe, if possibly sub-optimal. Currently (May 2005) only MWCW 9 and Visual C++ 8 have the necessary compiler-_intrinsics.

关于c++ - 使用 SFINAE 检测 C++ 中类型的 POD-ness,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/534555/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com