首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++:如何使用type_traits来确定一个类是否是微不足道的?

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

Stack Overflow用户
提问于 2011-10-02 13:03:40
回答 2查看 3.2K关注 0票数 10

在C++0x中,我想确定一个类是否是微不足道的/具有标准布局,这样我就可以使用memcpy()、memset()等……

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

代码语言:javascript
复制
template< typename T >
bool isTrivialType()
{
  bool isTrivial = ???
  return isTrivial;
}

注意: is_pod()限制太多:我希望我的类有简单的构造函数,等等……...for便利性。

补充道:我认为std::is_standard_layout<>可能会给我想要的东西。1.如果我添加构造函数,它仍然返回true 2.如果我添加一个虚方法,它返回false这是我需要确定是否可以使用memcpy(),memset()

编辑:来自Luc Danton的解释和下面的链接(澄清):

代码语言:javascript
复制
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()变得快乐:

代码语言:javascript
复制
// N -> false
// T -> true
// SL -> ??? (if there are pointer members in destructor, we are in trouble)
// POD -> true

因此,看起来is_trivial_class<>是正确的: is_standard_layout<>不一定是正确的……

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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关于什么是琐碎的和标准的布局可能会帮助你指定你想要的确切需求。

票数 7
EN

Stack Overflow用户

发布于 2011-10-02 13:20:43

POD在C++11中的定义为:

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

因此,除非您违反了标准布局的规则或类似的规则,否则is_pod就足够了。如果你打破了标准布局的规则,那么你就不能使用memcpymemset等等。

所以我不知道你为什么需要这个,除非你特别想测试琐碎的东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7624714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档