std::is_trival<T>::value
可以确定T类是否微不足道。但是,我想不出需要这些信息的场景。
有没有例子?
我的一些想法:
如果T类很简单,是否意味着可以memcpy
安全地复制T,如下所示:
T t1, t2;
memcpy(&t1, &t2, sizeof(T));
答案 0 :(得分:6)
如果类型很简单,例如可以使用memcpy
进行复制。这是用作用户定义类型的要求,用作std::atomic
模板的参数。也就是说,对于用户定义的类型T
,允许atomic<T>
(对于需要更大的类型),实现从类型T
的对象到类型{的对象的赋值{1}} atomic<T>
。同样,在需要时,使用memcpy
进行相等性测试。
使用这些C函数而不是C ++运算符的原因是原子操作不会对用户代码进行任何调用。这样做可能会导致无辜的代码出现神秘的僵局。
答案 1 :(得分:0)
实际上,普通的类型对/ something /有用,只需要一个字符指针和一个长度。 Pete Becker的答案描述了重要案例,但这里有些愚蠢:你可以使用std::ostream::write
序列化一个简单的类型,并使用std::istream::read
读回来。
template<typename T>
std::enable_if<std::is_trivial<T>, void>
bin_write(std::ostream& out, const T& data) {
out.write(reinterpret_cast<const char*>(&data), sizeof(T));
}
template<typename T>
std::enable_if<std::is_trivial<T>::value, T>
bin_read(std::istream& in) {
using T_in = std::remove_cv_t<T>; //even if T is const, the buffer can't be
T_ buffer;
in.read(reinterpret_cast<char*>(&buffer), sizeof(T_));
return buffer;
}
显然你不能在原始指针(或原始指针包装器,例如std::experimental::observer_ptr
)上使用它。这会忽略字节序,因此您可能不希望将此数据发送到其他计算机上的其他应用程序。但是,如果你想编写模拟重启文件,或者你需要在GCC编译的C ++和GCC编译的Fortran之间传输数据,它会很有用。