C++ 如何对结构中的位进行置乱?

C++ 如何对结构中的位进行置乱?,c++,random,bits,memset,packing,C++,Random,Bits,Memset,Packing,我有一对pack/unpack函数,它们在数据结构上运行 为了有效地对它们进行单元测试, 我想将此结构置于随机状态,然后验证打包和解包是否返回原始结构。它可能看起来像这样: for (int i = 0; i < LOTS_OF_TESTS; ++i){ Struct s; randomize_bits(s); CHECK ( s == UnPack(Pack(s)) ); } for(int i=0;i

我有一对
pack/unpack
函数,它们在数据结构上运行

为了有效地对它们进行单元测试,
我想将此结构置于随机状态,然后验证打包和解包是否返回原始结构。它可能看起来像这样:

for (int i = 0; i < LOTS_OF_TESTS; ++i){
    Struct s;
    randomize_bits(s);
    CHECK ( s == UnPack(Pack(s)) );
}
for(int i=0;i
是否有一个函数采用泛型类型,并将所有位随机化?

条件:
-结构中没有指针
-可能有基本类型
-可能存在嵌套结构
-可能存在数组
-我不关心填充


我想我可以用一些东西,
“购买我的尝试”会给我一个运行时异常

template<typename T>
void randomize_bits(T & t){
    for (size_t i = 0; i < sizeof(t); ++i){
        std::memset((&t)+i,random_uchar(),1);
    }
}
模板
无效随机化位(T&T){
对于(大小i=0;i
正如Basile所建议的,这解决了我的问题,并正确地迭代了内存

template<typename T>
void randomize_bits(T & t){
    for (size_t i = 0; i < sizeof(t); ++i){
        reinterpret_cast<unsigned char*>(&t)[i] = random_uchar();
    }
}
模板
无效随机化位(T&T){
对于(大小i=0;i
为什么不进行简单的强制转换:
(reinterpret\u cast)[i]=random\u uchar()?您确定运行时异常与该代码段相关吗?“我想虫子在别处……”BasileStarynkevitch是的,我想是的@BasileStarynkevitch:它会生成一个SigSeGV或类似的-不是C++异常——因为<代码>(&t)+i <代码>以<代码> > <代码> >单元操作。上面的cast思想要好得多,不过第一个左括号应该移到
t
之前。这对浮点类型不起作用,因为NaN不等于它本身。使用适当类型的随机值逐个字段初始化结构