Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:如何使用type_traits来确定类是否微不足道?_C++_C++11_Typetraits - Fatal编程技术网

C++ C++;:如何使用type_traits来确定类是否微不足道?

C++ C++;:如何使用type_traits来确定类是否微不足道?,c++,c++11,typetraits,C++,C++11,Typetraits,在C++0x中,我想确定类是否平凡/是否具有标准布局,以便可以使用memcpy()、memset()等 我应该如何使用type_traits实现下面的代码,这样我才能确认某个类型是平凡的 template< typename T > bool isTrivialType() { bool isTrivial = ??? return isTrivial; } 要让memcpy()快乐: // N -> false // T -> true // SL ->

在C++0x中,我想确定类是否平凡/是否具有标准布局,以便可以使用memcpy()、memset()等

我应该如何使用type_traits实现下面的代码,这样我才能确认某个类型是平凡的

template< typename T >
bool isTrivialType()
{
  bool isTrivial = ???
  return isTrivial;
}
要让memcpy()快乐:

// N -> false
// T -> true
// SL -> ??? (if there are pointer members in destructor, we are in trouble)
// POD -> true

所以它看起来确实像是一个普通类是正确的:标准布局不一定正确…

C++11中POD的定义是:

POD结构是一个非联合类,它既是普通类又是标准布局类,并且没有非POD结构、非POD联合(或此类类型的数组)类型的非静态数据成员

因此,除非您违反了标准布局规则或类似性质的规则,
is\u pod
就足够了。如果您违反了标准布局的规则,那么就不能使用
memcpy
memset
等等


所以我不知道你为什么需要这个,除非你试图专门测试琐碎性。

对于
std::memcpy
类型可以简单地复制就足够了。n3290中的3.9类型[基本类型]第2段:

对于普通可复制类型T的任何对象(基类子对象除外),无论该对象是否持有类型T的有效值,构成该对象的底层字节(1.7)都可以复制到字符或无符号字符数组中

以下段落还描述了普通可复制类型的其他有用属性(即,不只是复制到
char
数组)

std::是可复制的
是检测这一点的特征。然而,在我写这篇文章时,它并不是由GCC实现的,因此您可能希望使用
std::is_triple
作为回退(因为它反过来需要一个简单的复制构造函数)


我真的不建议使用
is\u standard\u layout
,除非您真的知道自己在做什么(例如,某个特定平台上的语言互操作性),否则这不是您想要的。关于琐碎和标准布局可能会帮助您指定所需的确切要求。

一个POD足以满足标准布局。但是,它的限制性太强了。例如,如果我添加了一个构造函数,即使只是简单地设置了一个成员,它也不再是POD,但从技术上讲,如果我理解正确,它仍然具有标准布局(即,我可以安全地使用memcpy和memset)。这就是问题所在:POD似乎对我的需求限制太多了。看起来新添加的std::is_standard_布局可以做我想做的事情-与POD不同,我可以添加构造函数,它仍然会返回trueStandard布局不太正确<例如,code>std::vector很可能是标准布局,但是使用
memcpy
将是一个坏主意。谢谢你,Luc-在调查了你的喜好之后,我认为你有了最好的答案-ty建议使用std::作为gcc的后备方案是微不足道的!在gcc实现之前,我将alias可复制到is_平凡,这样,我就可以在一个地方更新我的代码。
// N -> false
// T -> true
// SL -> ??? (if there are pointer members in destructor, we are in trouble)
// POD -> true