Чтобы сравнить данные, на которые указывает void*
, вы должны знать, что это за тип. Если вы знаете, что такое тип, нет необходимости в void*
. Если вы хотите, чтобы написать функцию, которая может быть использована для нескольких типов, можно использовать шаблоны:
template<typename T>
bool compare(const T& firstVal, const T& secondVal)
{
if (firstVal < secondVal)
{
// do something
}
return something;
}
Для того, чтобы проиллюстрировать, почему попытки сравнить недействительные указатели слеп не представляется возможным:
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.
Как вы можете видеть, делая это, вы потеряете все типобезопасность и имеют целый ряд других вопросов, которые вы должны иметь дело с.
Это звучит как проблема XY. Почему вы пытаетесь сравнить void вместо фактических типов? Что вы пытаетесь сделать? –
Я ответил на этот вопрос ниже. – user2962977
Ваш вопрос не имеет никакого смысла. Вы говорите в начале своего вопроса, что сравнение адресов, а не значений, не имеет смысла (news-flash. Значение указателя *** - это адрес ***). Очень * следующее предложение * вы говорите: «Мне нужно сравнить два значения указателя void». Поэтому выберите один. Это адреса или значения * на * те адреса, которые вы хотите сравнить? – WhozCraig