В C# можно проверить равенство для любого объекта против какого-либо объекта, поскольку все наследуется от Object.
Это просто неверно. Хотя верно, что каждый класс наследует метод Equals
, этот метод не обязательно делает ничего значимого, если он не был отменен.
Вы можете достичь того же в C++, но это довольно плохая практика, и, вероятно, не то, что вы хотите:
template <typename A, typename B>
bool equals(A const& a, B const& b) {
return reinterpret_cast<char const*>(&a) == reinterpret_cast<char const*>(&b);
}
... это будет ваш резервный случай (реализации идентификатора ссылки). Теперь вы можете добавить одну, где типы реализации соответствующего оператора (через SFINAE):
template <typename T>
auto equals(T const& a, T const& b) -> decltype(a == b) {
return a == b;
}
Однако, чтобы подтвердить, это не является ни советовал, ни вообще полезно. Это в основном бессмысленно - либо вы уже знаете, что (и как) вы можете сравнивать свои объекты, либо сравнение не имеет смысла для начала.
Дизайн C# явно плохой. Просто нет общей концепции «равенства», и тип C# Object
в этом отношении слишком переопределен.
Для struct
с, C# реализует почленно равенство, которое, возможно, более значимым, но также, как правило, не то, что хотел, и очень неэффективно для загрузки (так как он использует отражение).
Оставьте свой код :) – Drax
Что вы подразумеваете под равенством? Есть несколько способов определить, что означает равенство, что ИМХО является одной из причин, по которым вы не можете сравнивать произвольные объекты в 'C++'. Некоторые параметры: один и тот же объект (т. Е. Адрес), побитовое, концептуально равное, ... –
TDD на сильно типизированных языках обычно требует, чтобы вы определили, с какими типами вы работаете, когда пишете тест. –