为了比较 a 指向的数据void*
,你必须知道类型是什么。如果您知道类型是什么,则不需要void*
. 如果要编写可用于多种类型的函数,请使用模板:
template<typename T>
bool compare(const T& firstVal, const T& secondVal)
{
if (firstVal < secondVal)
{
// do something
}
return something;
}
为了说明为什么尝试盲目比较 void 指针是不可行的:
bool compare(void* firstVal, void* secondVal)
{
if (*firstVal < *secondVal) // ERROR: cannot dereference a void*
{
// do something
}
return something;
}
因此,您需要知道要比较的大小,这意味着您要么需要传入std::size_t
参数,要么需要知道类型(实际上,为了传入std::size_t
参数,您必须知道类型):
bool compare(void* firstVal, void* secondVal, std::size_t size)
{
if (0 > memcmp(firstVal, secondVal, size))
{
// do something
}
return something;
}
int a = 5;
int b = 6;
bool test = compare(&a, &b, sizeof(int)); // you know the type!
这在 C 中是必需的,因为模板不存在。C++ 有模板,这使得这种类型的函数声明变得不必要和低级(模板允许强制类型安全 - void 指针不允许,如下所示)。
当你做这样的事情(愚蠢)时,问题就来了:
int a = 5;
short b = 6;
bool test = compare(&a, &b, sizeof(int)); // DOH! this will try to compare memory outside the bounds of the size of b
bool test = compare(&a, &b, sizeof(short)); // DOH! This will compare the first part of a with b. Endianess will be an issue.
正如您所看到的,这样做会失去所有类型安全性,并且需要处理大量其他问题。