Я не уверен, если это то, что вы ищете, но для что-нибудь подобное, что вы описали в своем комментарии к работе, вы необходимость наследования. Все ваши шаблонных классов должны получить от общей базы, где сравнение происходит:
private:
virtual void doBinaryFunction(Base const& other) const = 0;
public:
void binaryFunction(Base const& other) const
{
if (typeid(*this) != typeid(other)) {
throw std::runtime_error("Type mismatch");
}
doBinaryFunction(other);
}
В каждом из производных классов, вы static_cast
Base const&
к Derived const&
, а затем делать все, что должно быть сделано.
Если вы хотите обрабатывать смешанные типы, вам потребуется форма обратной связи .
Вы также указали реализацию «сложения», где типы, которые должны быть добавлены , отличаются. Проблема в том, что добавление имеет тип возврата, который зависит от добавляемых типов. Обычный способ управления этим - это решить канонический тип (например, double). В этом случае лучшим решением является, возможно, предоставление своего рода виртуальной функции, которая возвращает значение как канонический тип , добавляет ли канонический тип и вернет его.
Тем не менее, это очень плохой дизайн. Во-первых, из , конечно, вы не «добавляете» ford
и chevy
и рассчитываете получить сумму их скорости . Это просто не имеет смысла. Вы можете добавить ford.speed()
и chevy.speed()
(хотя я не думаю, что добавление скорости два неродственных автомобилей имеет смысл либо), но независимо от реализаций speed
функции должна возвращать канонический тип скорости; , еслиford
и chevy
имеют разные типы бетона, вы будете звонить через интерфейс, определенный в базовом классе.
Мета-урок здесь состоит в том, что вам не нужна динамическая обработка исключений, чтобы уловить статическую ошибку программирования. –
«Когда я компилирую, я получаю ошибку несоответствия ... но я хочу, чтобы это исключало исключение» - ** why **? Это не имеет никакого смысла. Это * хорошая вещь, что это ошибка компиляции, а не исключение во время выполнения. –
Не говоря уже о том, что 'typeid (var1) .name() == typeid (var2) .name()' на самом деле ничего не значит, поскольку он сравнивает указатели (которые могут быть разными, даже если текст, на который они указывают, является –