C++ 比较C++;

C++ 比较C++;,c++,pointers,compare,void,C++,Pointers,Compare,Void,我的实际问题是,当您实际知道两个void指针中包含的值是同一类型时,是否真的可以比较它们?例如int void compVoids(void *firstVal, void *secondVal){ if (firstVal < secondVal){ cout << "This will not make any sense as this will compare addresses, not values" << endl;

我的实际问题是,当您实际知道两个void指针中包含的值是同一类型时,是否真的可以比较它们?例如int

void compVoids(void *firstVal, void *secondVal){
     if (firstVal < secondVal){
          cout << "This will not make any sense as this will compare addresses, not values" << endl;
     }
} 
void compVoids(void*firstVal,void*secondVal){
如果(第一个值<第二个值){

您需要取消引用它们并使用

if (*(int*) firstVal < *(int*) secondVal)

如果第一个较小,则为负数;如果它们相等,则为0;如果第一个较大,则为正数。当您要比较
int
数据时,只需调用此函数。

您需要取消对它们的引用并使用

if (*(int*) firstVal < *(int*) secondVal)

如果第一个较小,则为负数;如果它们相等,则为0;如果第一个较大,则为正数。当您要比较
int
数据时,只需调用此函数。

这是绝对可能的,但由于它们是空指针,因此必须指定要比较的数据量和方式

可能就是您要查找的。它使用两个空指针和一个要比较的字节数参数并返回一个比较。但是,某些比较并不取决于所有数据是否相等。例如:比较两个向量的方向而忽略其长度


这个问题没有明确的答案,除非您指定要如何比较数据。

这肯定是可能的,但由于它们是无效指针,您必须指定要比较多少数据以及如何比较

可能就是您要查找的。它使用两个空指针和一个要比较的字节数参数并返回一个比较。但是,某些比较并不取决于所有数据是否相等。例如:比较两个向量的方向而忽略其长度


这个问题没有明确的答案,除非您指定如何比较数据。

为了比较由
void*
指向的数据,您必须知道类型是什么。如果您知道类型是什么,就不需要
void*
。如果您想编写一个可以用于多种类型的函数,you使用模板:

template<typename T>
bool compare(const T& firstVal, const T& secondVal)
{
    if (firstVal < secondVal)
    {
        // do something
    }
    return something;
}

这是C中不需要的,因为模板不存在。C++有模板,这使得这种类型的函数声明不必要和低级(模板允许执行类型安全-空洞指针,我将在下面显示)。 当你做这样(愚蠢的)事情时,问题就出现了:

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.

正如您所看到的,这样做会失去所有类型安全性,并有一大堆其他问题需要处理。

为了比较由
void*
指向的数据,您必须知道类型是什么。如果您知道类型是什么,则无需使用
void*
。如果您想编写一个可用于r多种类型,您可以使用模板:

template<typename T>
bool compare(const T& firstVal, const T& secondVal)
{
    if (firstVal < secondVal)
    {
        // do something
    }
    return something;
}

这是C中不需要的,因为模板不存在。C++有模板,这使得这种类型的函数声明不必要和低级(模板允许执行类型安全-空洞指针,我将在下面显示)。 当你做这样(愚蠢的)事情时,问题就出现了:

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.

如您所见,这样做会失去所有类型安全性,并有大量其他问题需要处理。

是的。事实上,如果类型为无符号int,则代码是正确的。即使不推荐,也经常使用将int值强制转换为void指针

您也可以强制转换指针,但必须直接将其强制转换为int类型:

if ((int)firstVal < (int)secondVal)

是的。事实上,如果类型为unsigned int,则代码是正确的。即使不推荐,也经常使用将int值转换为void指针

您也可以强制转换指针,但必须直接将其强制转换为int类型:

if ((int)firstVal < (int)secondVal)

这听起来像是一个XY问题。你为什么试图比较void而不是实际的类型?你想做什么?我已经回答了下面的问题。你的问题毫无意义。你在问题的开头说比较地址,而不是值是没有意义的(新闻快讯。指针值是地址)。下一句你说“我需要比较两个空指针值”因此,选择一个。是要比较的地址还是那些地址的值?二叉树注释?如果是这样,模板才是您真正需要的…不是void指针。这两个值的类型相同:
void*
。如果您需要知道指针指向的对象的实际类型,请不要使用
void*
。您不能在扔掉类型信息后将其取回。这听起来像是XY问题。你为什么试图比较void而不是实际的类型?你试图做什么?我已经回答了下面的问题。你的问题毫无意义。你在问题开始时说比较地址,而不是v值,没有意义(新闻快讯。指针值就是地址)。下一句你说“我需要比较两个空指针值”因此,选择一个。是要比较的地址还是那些地址的值?二叉树注释?如果是这样,模板才是您真正需要的…不是void指针。这两个值的类型相同:
void*
。如果您需要知道指针指向的对象的实际类型,请不要使用
void*
。您不能在扔掉类型信息后将其取回。这是因为我正在创建二叉树,在该函数之外,用户决定要插入的数据类型。因此,树内的数据将始终是相同的类型,但包含在结构中分配的void*data中。要在树内移动并决定将值放置在何处,请e、 我需要对它们进行比较。更新后,我建议将其抽象到另一个函数中。这是因为我正在创建二叉树,在该函数之外,用户决定要插入的数据类型。因此,树中的数据将是