Estoy escribiendo una función de actualización genérica para EEPROM que compara el valor antiguo con el nuevo y luego, si los valores difieren, escribe uno nuevo en eeprom. Esta es la función:
template <typename T>
void update(uint16_t update_address, T& update_value)
{
// Do not attempt to read until device is ready
while (!TM_I2C_IsDeviceConnected(EEPROM_I2Cx_, EEPROM_ADDRESS)) {}
T current_value;
read(update_address, current_value);
if (memcmp(¤t_value, &update_value, sizeof(T)) != 0)
{
// Do not attempt to write until device is ready
while (!TM_I2C_IsDeviceConnected(EEPROM_I2Cx_, EEPROM_ADDRESS)) {}
write(update_address, update_value);
}
}
El problema es la comparación. Leí que, debido al relleno, las variables pueden diferir si se trata de estructuras en ciertos casos y generalmente es una mala idea usar memcmp para comparar dos estructuras. Pero quiero que mi función sea genérica. Podría asumir que el operador "==" está definido y usar
template <typename T>
void update(uint16_t update_address, T& update_value)
{
// Do not attempt to read until device is ready
while (!TM_I2C_IsDeviceConnected(EEPROM_I2Cx_, EEPROM_ADDRESS)) {}
T current_value;
read(update_address, current_value);
if (current_value != update_value)
{
// Do not attempt to write until device is ready
while (!TM_I2C_IsDeviceConnected(EEPROM_I2Cx_, EEPROM_ADDRESS)) {}
write(update_address, update_value);
}
}
pero me pregunto si en este caso se necesita REALMENTE un operador "==". Después de todo, simplemente estoy comparando bytes sin procesar, sin lógica involucrada (es decir, uint8_t boolean puede ser cierto en ambas estructuras, incluso si una es 1 y otra 100 y esto debería manejarse adecuadamente, pero en este caso no importa en absoluto como debería ser una y la misma estructura por byte), pero esa cosa de relleno me ha echado un poco. Por lo tanto, mi pregunta es: ¿Está bien en este caso en particular usar memcmp (T puede ser de cualquier tipo, probablemente en muchos casos una estructura) y el relleno puede causar problemas o debo asumir o, más bien, exigir explícitamente al operador "==" que ¿Ser definido antes de usar la función?