我是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;
}
}
答案 0 :(得分:0)
不要这样做。 但如果你真的想要,你可以:
std::string& operator+(std::string& lhs, int rhs)
{
throw std::runtime_error("That's really stupid.");
return lhs;
}
答案 1 :(得分: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&
到Derived const&
,然后执行必要的操作
完成。
如果你想处理混合类型,你需要某种形式的 双重派遣。
你还提到实现“添加”,其中的类型 添加是不同的。这里的问题是添加了 返回类型取决于要添加的类型。通常 处理这个问题的方法是决定规范类型(比如说 双)。在这种情况下,最好的解决方案可能是提供 某种虚函数,它返回值为 规范类型,使用规范类型进行添加,以及 把它归还。
从来没有这样,这是非常糟糕的设计。首先
当然,你没有“添加”ford
和chevy
并期望获得
他们的速度之和。这没有意义。你可能会
添加ford.speed()
和chevy.speed()
(虽然我不认为
增加两辆无关汽车的速度也是有意义的,)
但无论如何实现,speed
函数
必须返回规范类型以获得速度; if ford
和
chevy
有不同的具体类型,你会打电话
通过基类中定义的接口。