C++ C++;:如何使用type_traits来确定类是否微不足道?
在C++0x中,我想确定类是否平凡/是否具有标准布局,以便可以使用memcpy()、memset()等 我应该如何使用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 ->
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