c++:在泛型代码中获取对象大小的最佳方法

C++: best way to get size of object in generic code

本文关键字:最佳 方法 取对象 获取 泛型 代码 c++      更新时间:2023-10-16

我正在编写一个模板类,它调用一个散列函数,该函数以指向对象的指针和对象的大小作为参数。

例如,如果itemint类型,则调用将是
MurmurHash2(&item, sizeof(item), seed);
但是如果itemstd::string,我们就必须做
MurmurHash2(item.c_str(), item.size(), seed);

什么是最干净的方式来写这段代码,使它可以处理尽可能多的类型?

你的解决方案本质上是有缺陷的,你不能通过一个指向对象开头和对象大小的指针来创建一个哈希函数,并期望它能工作。考虑一个简单类型和两个变量:

struct T {
   char ch;
   int  i;
} a = { 'a', 1 }, b = { 'a', 1 };

在我目前的平台上(我想象在大多数平台上),sizeof(T) == 8中只有5个字节是对象的的一部分,其他3个是填充。填充中的字节值不能保证有任何值,即使两个对象持有相同的值,它们在ab中也可能不同。

一个可能的解决方案:使用Boost之类的东西。序列化将对象转换为标准化的字节流,然后将其与大小一起传递给MurmurHash函数。