Andrei Alexandrescu 在上一届C++ 和 Beyond 上就系统错误处理进行了演讲。我喜欢 Expected 模板模式并将其改编为 Visual Studio 2010,因为编译器目前不支持扩展联合。所以我写了一个 UnitTest 来检查一切是否正常。然后我想检查切片异常的检测是否有效。但它没有。
我不想在这里粘贴完整的代码,所以我试图减少这一点:
#include <iostream>
#include <string>
#include <exception>
#include <typeinfo>
class MyException : public std::exception
{
public:
MyException()
: std::exception()
{}
virtual const char* what() const { return "I come from MyException"; }
};
void hereHappensTheFailure()
{
throw MyException();
}
template <class E>
void detector(const E& exception)
{
if (typeid(exception) != typeid(E))
{
std::cout << "Exception was sliced" << std::endl;
}
else
{
std::cout << "Exception was not sliced" << std::endl;
}
}
int main()
{
try
{
hereHappensTheFailure();
}
catch (std::exception ex) // intentionally catch by value to provoke the problem
{
detector(ex);
}
return 0;
}
但是没有检测到切片。那么我的测试是否有错误,这不适用于 VS2010 还是模式最终不起作用?(刚刚编辑,因为ideone上的 gcc 4.7.2不喜欢它)提前非常感谢!