Is using memcmp when updating struct in EEPROM okay?
If you really want your template class to be generic (and it seems you want to), you should be using the == operator. Indeed, there might be uninitialized padding bytes in the struct, and your comparison with memcmp would return false even if the fields all have the same value. Of, course, this requires the == operator to be appropriately defined for the underlying type, but that is a safer assumption than considering all bytes of the struct have significance.

This choice has the following consequences:


More flexibility: on some underlying types, you may have fields that you don't need/want to compare. It is the case if you have fields that are deduced from other parts of the struct: for example, if the object contains an ID and a name and you know that there is a one-to-one association between name and ID, you just have to compare the ID in the == operator, making the comparison faster. Another example: if, in the struct, there is a hash on the object data, you will first compare the hash to check if objects are unequal to improve speed, before comparing all fields one-by-one.
The call of the == operator can eventually be inlined by the compiler, whereas the memcmp call certainly won't (unless it is declared inlineable, but I doubt it). This may allow the complier to produce more efficient code. On the other hand, this may also lead to code bloat. Check the reulting compiled code if you have severe constraints on code size. There are ways to avoid code bloat resulting from templates, but it's outside the scope of your question.