在C ++ 0x中,我想确定一个类是否很简单/有标准布局,所以我可以使用memcpy(),memset()等...
我应该如何使用type_traits实现下面的代码,这样我才能确认某个类型是微不足道的?
template< typename T >
bool isTrivialType()
{
bool isTrivial = ???
return isTrivial;
}
注意:is_pod()限制性太强:我希望我的班级有琐碎的构造函数等......为方便起见。
补充:我认为std :: is_standard_layout&lt;&gt;可能会给我我正在寻找的东西。 1.如果我添加构造函数,它仍然返回true 2.如果我添加虚方法,则返回false 这是我需要确定是否可以使用memcpy(),memset()
编辑:来自Luc Danton的解释和链接(澄清):
struct N { // neither trivial nor standard-layout
int i;
int j;
virtual ~N();
};
struct T { // trivial but not standard-layout
int i;
private:
int j;
};
struct SL { // standard-layout but not trivial
int i;
int j;
~SL();
};
struct POD { // both trivial and standard-layout
int i;
int j;
};
让memcpy()感到高兴:
// N -> false
// T -> true
// SL -> ??? (if there are pointer members in destructor, we are in trouble)
// POD -> true
所以它看起来像is_trivial_class&lt;&gt;是正确的:is_standard_layout&lt;&gt;不一定是对的......
答案 0 :(得分:6)
对于std::memcpy
,类型可以轻易复制就足够了。从n3290,3.9类型[basic.types]第2段:
对于普通可复制类型T的任何对象(基类子对象除外),无论对象是否保持类型T的有效值,组成对象的基础字节(1.7)都可以复制到数组中char或unsigned char。
以下段落还描述了平凡可复制类型的其他有用属性(即不仅仅是复制到char
数组)。
std::is_trivially_copyable
是检测这一点的特质。但是,在我的写作中,它并未由例如GCC,因此您可能希望使用std::is_trivial
作为后备(因为它反过来需要一个简单的复制构造函数)。
我真的不建议使用is_standard_layout
,除非你真的知道你在做什么(例如在一个特定平台上的语言互操作性),这不是你想要的。 More information关于什么琐碎和标准布局可能会帮助您指定您想要的确切要求。
答案 1 :(得分:1)
C ++ 11中POD的定义是:
POD结构是一个非联合类,它既是一个普通的类又是一个标准布局类,并且没有非POD结构类型的非静态数据成员,非POD联合(或这些类型的数组) )。
因此,除非您违反标准布局规则或具有此类性质的规则,否则is_pod
应该足够了。如果您违反标准布局规则,则无法使用memcpy
和memset
等等。
所以我不知道为什么你需要这个,除非你试图专门测试琐事。