gpt4 book ai didi

C++ : how do I use type_traits to determine if a class is trivial?

转载 作者:可可西里 更新时间:2023-11-01 17:52:27 26 4
gpt4 key购买 nike

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

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

template< typename T >
bool isTrivialType()
{
bool isTrivial = ???
return isTrivial;
}

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

补充:我认为 std::is_standard_layout<> 可能会给我我正在寻找的东西。1. 如果我添加构造函数,它仍然返回 true2.如果我添加一个虚方法,它返回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<> 不一定是正确的...

最佳答案

对于 std::memcpy 类型可以简单复制就足够了。来自 n3290,3.9 类型 [basic.types] 第 2 段:

For any object (other than a base-class subobject) of trivially copyable type T, whether or not the object holds a valid value of type T, the underlying bytes (1.7) making up the object can be copied into an array of char or unsigned char.

以下段落还描述了普通可复制类型的其他有用属性(即不只是复制到 char 数组)。

std::is_trivially_copyable 是检测的特征。然而,在我撰写本文时,它并未由例如实现。 GCC,因此您可能希望使用 std::is_trivial 作为回退(因为它反过来需要一个普通的复制构造函数)。

我真的不推荐使用 is_standard_layout,除非你真的知道你在做什么(例如,某一特定平台上的语言互操作性)这不是你想要的。 More information关于什么是琐碎和标准布局,也许可以帮助您指定您想要的确切要求。

关于C++ : how do I use type_traits to determine if a class is trivial?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7624714/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com