C++:我如何使用type_traits来确定一个类是否是微不足道的?

kfm*_*e04 8 c++ pod type-traits c++11

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

我应该如何使用type_traits实现下面的代码,所以我可以确认一个类型是微不足道的?

template< typename T >
bool isTrivialType()
{
  bool isTrivial = ???
  return isTrivial;
}
Run Code Online (Sandbox Code Playgroud)

注意:is_pod()限制太多:我希望我的类有简单的构造函数等......为方便起见.

补充:我认为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;
};
Run Code Online (Sandbox Code Playgroud)

对于memcpy()要快乐:

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

所以看起来像is_trivial_class <>是正确的:is_standard_layout <>不一定正确......

Luc*_*ton 6

因为std::memcpy这种类型是可以轻易复制的就足够了.从n3290,3.9类型[basic.types]第2段:

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

以下段落还描述了平凡可复制类型的其他有用属性(即不仅仅是复制到char数组).

std::is_trivially_copyable是检测这一点的特质.但是,在我的写作中,它并没有由例如GCC实现,因此您可能希望将其std::is_trivial用作后备(因为它反过来需要一个简单的复制构造函数).

我真的不建议使用is_standard_layout,除非你真的知道你在做什么(例如在一个特定平台上的语言互操作性),这不是你想要的.有关琐碎性和标准布局的更多信息可能有助于您指定所需的确切要求.