Я новичок в c++ и изучаю, как обрабатывать исключения. Я хочу, чтобы программа выдавала исключение, если я пытаюсь добавить две переменные разных типов. Когда я скомпилирую, я получаю ошибку несоответствия, и сообщение, которое + не будет работать с этими двумя типами, но я хочу, чтобы оно вместо этого выбрало исключение.
#include <iostream>
#include <stdexcept>
#include <typeinfo>
using namespace std;
int main() {
try{
int var1 = 6;
string var2 = "7";
if (typeid(var1).name() == typeid(var2).name()){
cout << var1 + var2;
} else {
throw 99;
}
}catch (int e){
cout << "caught a " << e << endl;
}
}
Я не уверен, что это то, что вы ищете, но для чего-то вроде того, что вы описали в своем комментарии к работе, вам нужно наследование. Все ваши классы шаблонов должны основываться на общей базе, где происходит сравнение:
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&
to Derived const&
, а затем делаете все, что нужно сделать.
Если вы хотите обрабатывать смешанные типы, вам понадобится двойная отправка.
Вы также упоминаете реализацию "добавления", где типы, которые нужно добавить, различны. Проблема здесь в том, что добавление имеет тип возврата, который зависит от добавляемых типов. Обычный способ решения этой проблемы - решить канонический тип (скажем, двойной). В этом случае лучшим решением, вероятно, является предоставление какой-то виртуальной функции, которая возвращает значение как канонический тип, дополняет канонический тип и возвращает его.
Тем не менее, это очень плохой дизайн. Во-первых, конечно, вы не "добавляете" ford
и chevy
и ожидаете получить сумму своих скоростей. Это просто не имеет смысла. Вы можете добавить ford.speed()
и chevy.speed()
(хотя я не думаю, что добавление скорости двух несвязанных автомобилей имеет смысл), но тогда, независимо от реализаций, функция speed
должна возвращать канонический тип для скорости; если ford
и chevy
имеют разные конкретные типы, вы будете вызывать через интерфейс, определенный в базовом классе.
Не делай этого. Но если вы действительно этого хотите, вы можете:
std::string& operator+(std::string& lhs, int rhs)
{
throw std::runtime_error("That really stupid.");
return lhs;
}