我有一个例外的基类:
class BaseException : public std::runtime_error
{
public:
BaseException(int Code, std::string Msg) : runtime_error(Msg);
//...etc
};
在每个需要例外的类中,我嵌入了一个继承自Exception
的{{1}}类:
BaseException
现在我可以在class Foo
{
public:
class Exception : public BaseException
{
public:
Exception(int Code, std::string OptMsg = "") : BaseException(Code, OptMsg);
enum
{
Fire,
Flood,
Aliens
};
};
//...etc
};
内throw(Exception::Fire)
并按基类或Foo
捕捉并与Foo::Exception&
进行比较。
Foo::Exception::Fire
类定义几乎完全相同,只有枚举内容发生变化。因为DRY,我正在考虑编写一个允许这样的宏:
Exception
然而,宏在C ++中不受欢迎。还有更好的方法吗?
答案 0 :(得分:2)
怎么样:
template <typename T>
struct Exception : BaseException
{
Exception(int Code, std::string OptMsg = "") : BaseException(Code, OptMsg);
};
class Foo
{
public:
using Exception = ::Exception<Foo>;
enum ExceptionCodes
{
Fire,
Flood,
Aliens
};
//...etc
};
(编译器看不见)
唯一的区别是您必须引用Foo::Fire
或Foo::ExceptionCodes::Fire
。
您可以不使用using
语句,只需参考Exception<Foo>
。
答案 1 :(得分:2)
你可以&#34;继承&#34;使用BaseException
关键字的using
构造函数,而不是手动重新实现它们。这可以节省你一些打字。其余的样板很少,所以我个人不会担心它。
struct Foo {
struct Exception : BaseException {
using BaseException::BaseException;
enum {
Fire,
Flood,
Aliens
};
};
};