在C++0x中,我想确定一个类是否是微不足道的/具有标准布局,这样我就可以使用memcpy()、memset()等……
我应该如何使用type_traits实现下面的代码,这样我才能确认一个类型是微不足道的?
template< typename T >
bool isTrivialType()
{
bool isTrivial = ???
return isTrivial;
}注意: is_pod()限制太多:我希望我的类有简单的构造函数,等等……...for便利性。
补充道:我认为std::is_standard_layout<>可能会给我想要的东西。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<>是正确的: is_standard_layout<>不一定是正确的……
发布于 2011-10-02 14:24:49
对于std::memcpy来说,该类型只需简单地可复制即可。来自n3290,3.9 Types basic.types段落2:
对于平凡可复制类型T的任何对象(基类子对象除外),无论该对象是否持有类型T的有效值,组成该对象的底层字节(1.7)都可以复制到char或unsigned char数组中。
下面的段落还描述了简单可复制类型的其他有用属性(即不仅仅是复制到char数组)。
std::is_trivially_copyable正是能够检测到这一点的特征。然而,在我写这篇文章的时候,它还不是由例如GCC实现的,所以你可能想要使用std::is_trivial作为后备(因为它反过来需要一个简单的复制构造函数)。
我真的不推荐使用is_standard_layout,除非你真的知道你在做什么(例如,在特定平台上的语言互操作性)这不是你想要的。More information关于什么是琐碎的和标准的布局可能会帮助你指定你想要的确切需求。
发布于 2011-10-02 13:20:43
POD在C++11中的定义为:
POD结构是一个非联合类,它既是普通类又是标准布局类,并且没有非POD结构类型、非POD联合类型(或此类类型的数组)的非静态数据成员。
因此,除非您违反了标准布局的规则或类似的规则,否则is_pod就足够了。如果你打破了标准布局的规则,那么你就不能使用memcpy和memset等等。
所以我不知道你为什么需要这个,除非你特别想测试琐碎的东西。
https://stackoverflow.com/questions/7624714
复制相似问题