Как сгенерировать исключение при несоответствии данных

0

Я новичок в 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;
    }
}
Теги:

2 ответа

0
Лучший ответ

Я не уверен, что это то, что вы ищете, но для чего-то вроде того, что вы описали в своем комментарии к работе, вам нужно наследование. Все ваши классы шаблонов должны основываться на общей базе, где происходит сравнение:

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 имеют разные конкретные типы, вы будете вызывать через интерфейс, определенный в базовом классе.

  • 0
    спасибо за помощь Джеймс.
0

Не делай этого. Но если вы действительно этого хотите, вы можете:

std::string& operator+(std::string& lhs, int rhs)
{
    throw std::runtime_error("That really stupid.");
    return lhs;
}
  • 0
    Нет, мой пример - уменьшенная версия самой программы. lhs может быть int, float или string. То же самое для rhs. Я просто использовал их в качестве потенциальных типов ввода.
  • 0
    Тогда вам просто нужно написать перегрузку операторов для всех этих типов :) Если вы хотите делать бесполезные вещи, вы можете написать немного больше, это ничего не изменит ^. ^ И на самом деле вы можете попробовать с шаблонами;)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню